home *** CD-ROM | disk | FTP | other *** search
/ Amiga Collections: Franz PD / Franz PD Disk #030 (19xx)(Amiga User Group Deutschland e.V.).zip / Franz PD Disk #030 (19xx)(Amiga User Group Deutschland e.V.).adf / Virus-Control / VIRUS-CONTROL.s < prev    next >
Text File  |  1988-12-10  |  102KB  |  2,912 lines

  1. ; Pius Nippgen, Bergstr.12, 6657 Gersheim 8, Tel. 06843/781 (abends 06843/1522)
  2.  
  3. ; VIRUS-CONTROL V1.3  -  Sourcecode:
  4. ; ---------------------------------
  5. ; assembliert mit SEKA-Assembler.
  6. start:
  7.  move.l  $4.w,a6
  8.  movem.l d0/a0,Parameter   ; eventuelle zusätzliche Parameter retten
  9.  sub.l   a1,a1             ; FindTask() bzw. Prozeß
  10.  jsr     -294(a6)
  11.  move.l  d0,a1
  12.  tst.l   $ac(a1)           ; wenn Pointer to ConsoleLineInterpreter = 0 ->
  13.  bne.s   clistart          ; Workbenchstart -> muß Workbench-StartupMessage
  14.  move.l  d0,-(sp)          ; ahholen, da andernfalls Absturz !
  15.  lea     $5c(a1),a0
  16.  jsr     -384(a6)          ; WaitPort()
  17.  move.l  (sp)+,a1
  18.  lea     $5c(a1),a0
  19.  jsr     -372(a6)          ; GetMsg()
  20.  move.l  d0,-(sp)
  21.  lea     NOBOOTRtext(pc),a0
  22.  add.l   #reset,-8(a0)
  23.  add.l   #reset,-12(a0)
  24.  lea     NoWBStart(pc),a1
  25.  lea     NOBOOTR(pc),a2
  26.  lea     NOBOOTR(pc),a3    ; mittels Requester auf CLI-Start hinweisen
  27.  bsr     autorequest
  28.  sub.l   #reset,-8(a0)
  29.  sub.l   #reset,-12(a0)
  30.  move.l  (sp)+,a1
  31.  jmp     -378(a6)          ; ReplyMsg() + Ende
  32. clistart:
  33.  move.l  #end-reset+9000,d0; eigentliche VIRUS-CONTROL-Routine + Task-stack
  34.  move.l  #$10002,d1        ; Chip-Memory, da auf jedem Rechner vorhanden, und
  35.  jsr     -198(a6)          ; bereits in Cool-Vektor-Routine belegt werden kann.
  36.  move.l  d0,pointer        ; Speicher löschen, damit definiert vorbelegt
  37.  beq     weiter-2          ; error -> rts -> keine Installationsmeldung
  38.  move.l  -454(a6),oldDOIO  ; oldDOIO retten, wird dann mitkopiert
  39.  tst.l   546(a6)
  40.  bne.s   kickchanged
  41.  tst.l   550(a6)        ; wenn KICK-Vektoren verändert, nur Warnmeldung aus-
  42.  bne.s   kickchanged    ; geben, da Änderung auch durch seriöses Programm
  43.  tst.l   554(a6)        ; denkbar
  44.  beq.s   testBeginIO
  45. kickchanged:
  46.  move.l  #MeldungVektorEnde-MeldungVektor,textlaenge
  47.  move.l  #MeldungVektor,textadresse
  48.  bsr     meldungout
  49. testBeginIO:
  50.  lea     350(a6),a0     ; DeviceListStruktur
  51.  lea     trackdisk(pc),a1
  52.  jsr     -276(a6)       ; Adresse der Trackdisk-Node = trackdisk.device-Base
  53.  move.l  d0,a0
  54.  lea     -28(a0),a0
  55.  move.l  a0,BeginIOAdr  ; Adresse des BeginIO-Vektors holen
  56.  cmp.l   #$00fc0000,(a0); wird auch durch seriöse Programme (z.B.FACC) verbogen
  57.  bhs.s   testDOIO       ; deshalb nur Warnmeldung ausgeben
  58.  move.l  #MeldungVektorEnde-MeldungVektor,textlaenge
  59.  move.l  #MeldungVektor,textadresse
  60.  move.l  #"Begi",MeldungVektor+4
  61.  move.l  #"nIO-",MeldungVektor+8
  62.  bsr     meldungout
  63. testDOIO:
  64.  lea     newDOIO(pc),a0 ; prüfen, ob DOIO-Vektor bereits auf VIRUS-CONTROL
  65.  move.l  oldDOIO(pc),a3 ; verbogen ist,
  66.  moveq   #127,d0        ; wenn nicht, VIRUS-CONTROL installieren, aber nur
  67. aaaa:                   ; wenn DOIO noch nicht anderweitig verbogen wurde
  68.  cmpm.l  (a3)+,(a0)+
  69.  bne.s   install
  70.  dbra    d0,aaaa        ; VIRUS-CONTROL wurde schon installiert, da DOIO okay
  71.  
  72.  lea     reset(pc),a0   ; prüfen, ob COOL-Vektor auch noch auf VIRUS-CONTROL
  73.  move.l  46(a6),a3      ; verbogen ist
  74.  moveq   #127,d0        ; 127 Bytes vergleichen reicht aus
  75. bbbb:                   ; (127, weil größter Pluswert für moveq)
  76.  cmpm.l  (a3)+,(a0)+
  77.  bne     COOLchanged    ; Cool-Vektor auf anderes Programm (Virus?) verbogen
  78.  dbra    d0,bbbb
  79.  bra     isinstalled    ; alles okay, da beide Vektoren richtig verbogen
  80. install:
  81.  cmp.l   #$00fc0000,oldDOIO; prüfen, ob der DOIO-Vektor noch auf ROM zeigt,
  82.  ; prüfe allgemein auf ROM-Adresse, damit ROM-Version unahhängig.
  83.  ; wenn nicht, wurde er bereits von einem anderen Programm (Virus?) verbogen,
  84.  ; bra jmpoldDOIO würde dann in Virus springen.
  85.  blo     DOIOchanged
  86.  movem.l d1-d7/a0-a6,-(sp)
  87.  lea     taskname(pc),a1; es könnte Vektor-Kontroll-Task noch aktiv sein,
  88.  jsr     -294(a6)       ; da ein Window oder Requester noch in Arbeit,
  89.  tst.l   d0             ; DOIO, COOL-Vektor bereits zurückgesetzt.
  90.  movem.l (sp)+,d1-d7/a0-a6
  91.  bne     freemem
  92.  move.l  pointer(pc),a1 ; a1 wird bei copy verwendet
  93.  move.l  a1,d0
  94.  lea     Kennung(pc),a0 ; damit die Kennung nicht in virus-control steht
  95.  addq.b  #1,8(a0)       ; virus-control kann somit auch geschützt werden
  96.  lea     NOBOOT(pc),a0
  97.  add.l   d0,lastDOIO       -NOBOOT(a0)    ; absolute Adressen mit minus reset
  98.  add.l   d0,lastCOOL       -NOBOOT(a0)    ; assemblieren.
  99.  add.l   d0,NOBOOTtext     -NOBOOT-8(a0)  ; Diese absoluten Adressen nun an
  100.  add.l   d0,NOBOOTtext     -NOBOOT-12(a0) ; die aktuelle Speicheradresse
  101.  add.l   d0,NOBOOTRtext    -NOBOOT-8(a0)  ; anpassen.
  102.  add.l   d0,NOBOOTRtext    -NOBOOT-12(a0)
  103.  add.l   d0,OPENERRtext    -NOBOOT-8(a0)
  104.  add.l   d0,OPENERRtext    -NOBOOT-12(a0)
  105.  add.l   d0,NAME0text      -NOBOOT-8(a0)
  106.  add.l   d0,NAME0text      -NOBOOT-12(a0)
  107.  add.l   d0,NAME1text      -NOBOOT-8(a0)
  108.  add.l   d0,NAME1text      -NOBOOT-12(a0)
  109.  add.l   d0,NAME2text      -NOBOOT-8(a0)
  110.  add.l   d0,NAME2text      -NOBOOT-12(a0)
  111.  add.l   d0,NAME3text      -NOBOOT-8(a0)
  112.  add.l   d0,NAME3text      -NOBOOT-12(a0)
  113.  add.l   d0,ONEDIFFtext    -NOBOOT-8(a0)
  114.  add.l   d0,ONEDIFFtext    -NOBOOT-12(a0)
  115.  add.l   d0,CORRECTtext    -NOBOOT-8(a0)
  116.  add.l   d0,CORRECTtext    -NOBOOT-12(a0)
  117.  add.l   d0,PROTECTtext    -NOBOOT-8(a0)
  118.  add.l   d0,PROTECTLtext   -NOBOOT-8(a0)
  119.  add.l   d0,ALREADYNOtext  -NOBOOT-8(a0)
  120.  add.l   d0,ALREADYNOdeltext-NOBOOT-8(a0)
  121.  add.l   d0,ALREADYVItext  -NOBOOT-8(a0)
  122.  add.l   d0,ALREADYVItext  -NOBOOT-12(a0)
  123.  add.l   d0,ALREADYWORKtext-NOBOOT-8(a0)
  124.  add.l   d0,ALREADYNOnamtext-NOBOOT-8(a0)
  125.  add.l   d0,ALREADYNOnamtext-NOBOOT-12(a0)
  126.  add.l   d0,OPENFILEnamtext-NOBOOT-8(a0)
  127.  add.l   d0,OPENFILEnamtext-NOBOOT-12(a0)
  128.  add.l   d0,EXITtext       -NOBOOT-8(a0)
  129.  add.l   d0,linktext       -NOBOOT-8(a0)
  130.  add.l   d0,linktext       -NOBOOT-12(a0)
  131.  add.l   d0,neuschtext     -NOBOOT-8(a0)
  132.  add.l   d0,okktext        -NOBOOT-8(a0)
  133.  add.l   d0,noloadftext    -NOBOOT-8(a0)
  134.  add.l   d0,FILESCHUTZtext -NOBOOT-8(a0)
  135.  add.l   d0,WRITEBBtext    -NOBOOT-8(a0)
  136.  add.l   d0,WRITEBBtext    -NOBOOT-12(a0)
  137.  add.l   d0,OVERWRITEtext  -NOBOOT-8(a0)
  138.  add.l   d0,OVERWRITELtext -NOBOOT-8(a0)
  139.  add.l   d0,OVERWRITERtext -NOBOOT-8(a0)
  140.  add.l   d0,BOOTL          -NOBOOT-8(a0)
  141.  add.l   d0,BOOTLtext      -NOBOOT-8(a0)
  142.  add.l   d0,BOOTRtext      -NOBOOT-8(a0)
  143.  add.l   d0,REALLYBOOTtext -NOBOOT-8(a0)
  144.  add.l   d0,vektor0text    -NOBOOT-8(a0)
  145.  add.l   d0,VEKTORLtext    -NOBOOT-8(a0)
  146.  add.l   d0,VEKTORLtext    -NOBOOT-12(a0)
  147.  add.l   d0,gadtext16text  -NOBOOT-8(a0)
  148.  add.l   d0,gadtext16text  -NOBOOT-12(a0)
  149.  add.l   d0,gadtext15text  -NOBOOT-8(a0)
  150.  add.l   d0,gadtext15text  -NOBOOT-12(a0)
  151.  add.l   d0,gadtext14text  -NOBOOT-8(a0)
  152.  add.l   d0,gadtext14text  -NOBOOT-12(a0)
  153.  add.l   d0,gadtext13text  -NOBOOT-8(a0)
  154.  add.l   d0,gadtext13text  -NOBOOT-12(a0)
  155.  add.l   d0,gadtext12text  -NOBOOT-8(a0)
  156.  add.l   d0,gadtext12text  -NOBOOT-12(a0)
  157.  add.l   d0,gadtext11text  -NOBOOT-8(a0)
  158.  add.l   d0,gadtext11text  -NOBOOT-12(a0)
  159.  add.l   d0,gadtext8text   -NOBOOT-8(a0)
  160.  add.l   d0,gadtext8text   -NOBOOT-12(a0)
  161.  add.l   d0,gadtext7text   -NOBOOT-8(a0)
  162.  add.l   d0,gadtext7text   -NOBOOT-12(a0)
  163.  add.l   d0,gadtext6text   -NOBOOT-8(a0)
  164.  add.l   d0,gadtext6text   -NOBOOT-12(a0)
  165.  add.l   d0,gadtext5text   -NOBOOT-8(a0)
  166.  add.l   d0,gadtext5text   -NOBOOT-12(a0)
  167.  add.l   d0,gadtext4text   -NOBOOT-8(a0)
  168.  add.l   d0,gadtext4text   -NOBOOT-12(a0)
  169.  add.l   d0,gadtext3text   -NOBOOT-8(a0)
  170.  add.l   d0,gadtext3text   -NOBOOT-12(a0)
  171.  add.l   d0,gadtext2text   -NOBOOT-8(a0)
  172.  add.l   d0,gadtext2text   -NOBOOT-12(a0)
  173.  add.l   d0,gadtext1text   -NOBOOT-8(a0)
  174.  add.l   d0,gadtext1text   -NOBOOT-12(a0)
  175.  add.l   d0,gadtext0text   -NOBOOT-8(a0)
  176.  add.l   d0,gadtext0text   -NOBOOT-12(a0)
  177.  add.l   d0,gad90          -NOBOOT(a0)
  178.  add.l   d0,gad90          -NOBOOT+18(a0)
  179.  add.l   d0,gad90          -NOBOOT+34(a0)
  180.  add.l   d0,string0        -NOBOOT(a0)
  181.  add.l   d0,string0        -NOBOOT+4(a0)
  182.  add.l   d0,gad91          -NOBOOT(a0)
  183.  add.l   d0,gad91          -NOBOOT+18(a0)
  184.  add.l   d0,gad91          -NOBOOT+34(a0)
  185.  add.l   d0,string1        -NOBOOT(a0)
  186.  add.l   d0,string1        -NOBOOT+4(a0)
  187.  add.l   d0,gad92          -NOBOOT(a0)
  188.  add.l   d0,gad92          -NOBOOT+18(a0)
  189.  add.l   d0,gad92          -NOBOOT+34(a0)
  190.  add.l   d0,string2        -NOBOOT(a0)
  191.  add.l   d0,string2        -NOBOOT+4(a0)
  192.  add.l   d0,gad93          -NOBOOT(a0)
  193.  add.l   d0,gad93          -NOBOOT+18(a0)
  194.  add.l   d0,gad93          -NOBOOT+34(a0)
  195.  add.l   d0,string3        -NOBOOT(a0)
  196.  add.l   d0,string3        -NOBOOT+4(a0)
  197.  add.l   d0,gad0           -NOBOOT(a0)
  198.  add.l   d0,gad0           -NOBOOT+18(a0)
  199.  add.l   d0,gad0           -NOBOOT+26(a0)
  200.  add.l   d0,gad1           -NOBOOT(a0)
  201.  add.l   d0,gad1           -NOBOOT+18(a0)
  202.  add.l   d0,gad1           -NOBOOT+26(a0)
  203.  add.l   d0,gad2           -NOBOOT(a0)
  204.  add.l   d0,gad2           -NOBOOT+18(a0)
  205.  add.l   d0,gad2           -NOBOOT+26(a0)
  206.  add.l   d0,gad3           -NOBOOT(a0)
  207.  add.l   d0,gad3           -NOBOOT+18(a0)
  208.  add.l   d0,gad3           -NOBOOT+26(a0)
  209.  add.l   d0,gad4           -NOBOOT(a0)
  210.  add.l   d0,gad4           -NOBOOT+18(a0)
  211.  add.l   d0,gad4           -NOBOOT+26(a0)
  212.  add.l   d0,gad5           -NOBOOT(a0)
  213.  add.l   d0,gad5           -NOBOOT+18(a0)
  214.  add.l   d0,gad5           -NOBOOT+26(a0)
  215.  add.l   d0,gad6           -NOBOOT(a0)
  216.  add.l   d0,gad6           -NOBOOT+18(a0)
  217.  add.l   d0,gad6           -NOBOOT+26(a0)
  218.  add.l   d0,gad7           -NOBOOT(a0)
  219.  add.l   d0,gad7           -NOBOOT+18(a0)
  220.  add.l   d0,gad7           -NOBOOT+26(a0)
  221.  add.l   d0,gad8           -NOBOOT(a0)
  222.  add.l   d0,gad8           -NOBOOT+18(a0)
  223.  add.l   d0,gad8           -NOBOOT+26(a0)
  224.  add.l   d0,gad10          -NOBOOT(a0)
  225.  add.l   d0,gad10          -NOBOOT+18(a0)
  226.  add.l   d0,gad10          -NOBOOT+26(a0)
  227.  add.l   d0,gad11          -NOBOOT(a0)
  228.  add.l   d0,gad11          -NOBOOT+18(a0)
  229.  add.l   d0,gad11          -NOBOOT+26(a0)
  230.  add.l   d0,gad12          -NOBOOT(a0)
  231.  add.l   d0,gad12          -NOBOOT+18(a0)
  232.  add.l   d0,gad12          -NOBOOT+26(a0)
  233.  add.l   d0,gad13          -NOBOOT(a0)
  234.  add.l   d0,gad13          -NOBOOT+18(a0)
  235.  add.l   d0,gad13          -NOBOOT+26(a0)
  236.  add.l   d0,gad14          -NOBOOT(a0)
  237.  add.l   d0,gad14          -NOBOOT+18(a0)
  238.  add.l   d0,gad14          -NOBOOT+26(a0)
  239.  add.l   d0,gad15          -NOBOOT(a0)
  240.  add.l   d0,gad15          -NOBOOT+18(a0)
  241.  add.l   d0,gad15          -NOBOOT+26(a0)
  242.  add.l   d0,gad16          -NOBOOT+18(a0)
  243.  add.l   d0,gad16          -NOBOOT+26(a0)
  244.  add.l   d0,gadborders     -NOBOOT-8(a0)
  245.  add.l   d0,gadborder1     -NOBOOT-8(a0)
  246.  add.l   d0,pairs          -NOBOOT-8(a0)
  247.  add.l   d0,font           -NOBOOT(a0)
  248.  add.l   d0,window         -NOBOOT+26(a0)
  249.  add.l   d0,structtask     -NOBOOT+10(a0)
  250.  add.l   d0,end            -NOBOOT-30(a0)
  251.  add.l   d0,end            -NOBOOT-34(a0)
  252.  add.l   d0,end            -NOBOOT-38(a0)
  253.  lea     reset(pc),a0   ; pc-relativ adressieren, da kürzer
  254.  move.w  #end-reset-1,d0; da erst bei -1 (ffff) dbcc ende
  255. copy:
  256.  move.b  (a0)+,(a1)+    ; eigentliche VIRUS-CONTROL-Routine (reset: bis end:)
  257.  dbra    d0,copy        ; in den angeforderten Speicherbereich kopieren
  258.  move.l  pointer(pc),a1
  259.  add.l   #newDOIO-reset,a1
  260.  move.l  a1,-454(a6)    ; DOIO-Vektor auf VIRUS-CONTROL verbiegen
  261.  bsr     execchecksum   ; COOL-Vektor auf VIRUS-CONTROL verbiegen
  262.  move.l  pointer(pc),a1
  263.  move.l  a1,a2
  264.  add.l   #structtask-reset,a1  ; addtask
  265.  add.l   #task-reset,a2
  266.  sub.l   a3,a3          ; 2 Bytes statt  6 Bytes(move.l #0,a3)
  267.  jsr     -282(a6)
  268.  move.l  #MeldungEnde-Meldung,textlaenge
  269.  move.l  #Meldung,textadresse
  270.  bsr.s   meldungout
  271.  bra.s   checkdrive     ; eingelegte Disks prüfen
  272. DOIOchanged:
  273.  move.l  #"DOIO",vektorchanged
  274. COOLchanged:
  275.  bsr     freemem
  276.  move.l  #MeldungDangerEnde-MeldungDanger,textlaenge
  277.  move.l  #MeldungDanger,textadresse
  278.  bra.s   meldungout
  279. isinstalled:
  280.  bsr     freemem
  281.  move.l  #MeldungEnde-Meldung,textlaenge
  282.  move.l  #Meldung,textadresse
  283.  move.l  #"  be",Meldungmodify    ; Meldung modifizieren kürzer
  284.  move.l  #"reit",Meldungmodify+4  ; wie extra eigene Meldung
  285.  move.l  #"s   ",Meldungmodify+8
  286.  bsr.s   meldungout
  287.  bra.s   checkdrive         ; eingelegte Disks prüfen
  288. meldungout:
  289.  bsr     OpenDOS            ; OpenLibrary("dos.library",0);
  290.  jsr     -60(a6)            ; outputhandle holen
  291.  move.l  d0,d1
  292.  movem.l textadresse(pc),d2-d3 ; Adresse + Länge der Meldung
  293.  jsr     -48(a6)            ; write
  294.  bra     CloseDOS           ; CloseLibrary("dos.library") + rts
  295.  
  296. checkdrive:                 ; zuerst eventuelle zusätzliche Parameter auswerten
  297.  move.l  46(a6),a1
  298.  move.l  a1,VCreset
  299.  move.b  #$ff,openflag-reset(a1)    ; Open() nicht verbiegen als default
  300.  move.l  #"AUS ",gadtext15text-reset+14(a1)
  301.  move.w  #$ffff,colorflag-reset(a1) ; colorflag, searchfiles als default
  302.  move.l  #" AN ",gadtext0text-reset+14(a1)
  303.  move.l  #" AN ",gadtext16text-reset+14(a1)
  304.  movem.l Parameter(pc),d0/a0; zusätzliche Parameter
  305.  subq.l  #1,d0              ; d0 = Zeichenanzahl der zusätzlichen Parameter
  306.  beq.s   noparameter        ; wenn nur Programmname -> d0=1, da nur $0a(Return)
  307. testline:
  308.  cmp.b   #$20,(a0)
  309.  bne.s   testn
  310.  addq.l  #1,a0
  311.  bra.s   testline
  312. testn:
  313.  cmp.b   #"-",(a0)+         ; in a0 Adresse der zusätzlichen Parameter
  314.  bne.s   noparameter
  315.  cmp.b   #"c",(a0)          ; -c = kein Farbsignal bei Disk-Einlegen
  316.  bne.s   testt
  317.  clr.b   colorflag-reset(a1)
  318.  move.l  #"AUS ",gadtext0text-reset+14(a1)
  319.  addq.l  #1,a0
  320.  bra.s   testline
  321. testt:
  322.  cmp.b   #"t",(a0)          ; -t = eingelegte Disks nicht testen
  323.  bne.s   testo
  324.  clr.b   checkflag
  325.  addq.l  #1,a0
  326.  bra.s   testline
  327. testo:
  328.  cmp.b   #"o",(a0)          ; -o = Open() verbiegen
  329.  bne.s   testf
  330.  clr.b   openflag-reset(a1)
  331.  move.l  #" AN ",gadtext15text-reset+14(a1)
  332.  addq.l  #1,a0
  333.  bra.s   testline
  334. testf:
  335.  cmp.b   #"f",(a0)+         ; -f = S:NoWarning S:VirusName nicht durchsuchen
  336.  bne.s   noparameter
  337.  clr.b   searchfiles-reset(a1)
  338.  move.l  #"AUS ",gadtext16text-reset+14(a1)
  339.  bra.s   testline
  340.  
  341. noparameter:                ; Routine zum Prüfen der eingelegten Disks
  342.  moveq   #0,d0              ; df0: (ist auch eventueller Returncode)
  343.  tst.b   checkflag
  344.  beq     weiter-2
  345.  bsr     OpenDOS
  346.  moveq   #50,d1             ; 1 Sekunde warten, damit Vektor-Kontroll-Task
  347.  jsr     -198(a6)           ; Openflag entsprechend setzen kann
  348.  bsr     CloseDOS
  349.  bsr.s   check
  350.  moveq   #1,d0              ; df1:
  351.  bsr.s   check
  352.  moveq   #2,d0              ; df2:
  353.  bsr.s   check
  354.  moveq   #3,d0              ; df3:
  355.  bra.s   check
  356. check:
  357.  move.l  d0,-(sp)
  358.  sub.l   a1,a1                       ; FindTask()
  359.  jsr     -294(a6)
  360.  move.l  VCreset(pc),a1
  361.  lea     trackport-reset(a1),a1
  362.  move.l  d0,16(a1)
  363.  jsr     -354(a6)                    ; AddPort()
  364.  move.l  VCreset(pc),a1
  365.  lea     trackreq-reset(a1),a1
  366.  lea     trackdisk(pc),a0
  367.  moveq   #0,d1                       ; keine Flags
  368.  move.l  (sp)+,d0                    ; Laufwerk
  369.  jsr     -444(a6)                    ; OpenDevice()
  370.  tst.l   d0
  371.  bne.s   OpenDeviceError             ; d0 <> 0 -> Laufwerk nicht vorhanden
  372.  move.l  VCreset(pc),a0
  373.  lea     trackreq-reset(a0),a1
  374.  lea     trackport-reset(a0),a3
  375.  move.l  a3,14(a1)
  376.  lea     blockbuff-reset(a0),a3
  377.  move.l  a3,40(a1)
  378.  moveq   #2,d0
  379.  move.w  d0,28(a1)                   ; CMD_READ
  380.  lsl.l   #8,d0                       ; 512 Bytes ab 0 -> VIRUS-CONTROL
  381.  move.l  d0,36(a1)                   ; prüft zuerst, ob Disk eingelegt ist,
  382.  clr.l   44(a1)                      ; wenn nicht weiter mit alterDOIO-Routine
  383.  jsr     -456(a6)                    ; DOIO -> springt in VIRUSCONTROL
  384.  ; darf statt VCreset nicht 46(a6) benutzen, da in der auf VIRUS-CONTROL ver-
  385.  ; bogenen DOIO-Routine 'Beende Virus-Control' möglich ist, wodurch 46(a6) = 0
  386.  ; Vektor-Kontroll-Task wartet 5 Sekunden mit Speicherfreigabe -> genug Zeit
  387.  ; für Motor aus, CloseDevice() RemPort(), welche ja den Speicher noch benutzen
  388.  move.l  VCreset(pc),a1
  389.  lea     trackreq-reset(a1),a1
  390.  move.w  #9,28(a1)                   ; Motor
  391.  clr.l   36(a1)                      ; aus
  392.  jsr     -456(a6)                    ; DOIO
  393.  move.l  VCreset(pc),a1
  394.  lea     trackreq-reset(a1),a1
  395.  jsr     -450(a6)                    ; CloseDevice()
  396. OpenDeviceError:
  397.  move.l  VCreset(pc),a1
  398.  lea     trackport-reset(a1),a1
  399.  jsr     -360(a6)                    ; RemovePort()
  400.  bra     returncode
  401.  
  402. textadresse:  dc.l 0     ; Adresse der auszugebenden Meldung
  403. textlaenge:   dc.l 0     ; Länge der auszugebenden Meldung
  404. Parameter:    dc.l 0     ; Zeichenanzahl der zusätzlichen Eingabeparameter
  405. Parameteradr: dc.l 0     ; Adresse der zusätzlichen Eingabeparameter
  406. VCreset:      dc.l 0     ; Adresse des installierten VIRUS-CONTROL
  407. checkflag:    dc.b $ff
  408. frei:         dc.b 0
  409. trackdisk:    dc.b "trackdisk.device",0
  410.  even
  411. Meldung:
  412.  dc.b $9b,"33mVIRUS-CONTROL V1.3 von PIUS NIPPGEN "
  413. Meldungmodify: dc.b                       "erfolgreich installiert !",10,$9b,"31m"
  414.  dc.b "100% Assembler!   resetfest!   für alle Amigas!  sekündl.System-Vektorentest!",10
  415.  dc.b "Kill-Virus durch Vektoren-Restauration!   Bootblock-Schreibzugriff-Kontrolle!",10
  416.  dc.b "Reset+linke M.taste->entfernt VIRUSCONTROL!  Reset+rechte M.taste->NoFastMem!",10
  417.  dc.b "verdächtige Disk einlegen->WarnWindow! +L-ALT->immer WarnWindow! +R-ALT->nie!",10
  418.  dc.b "Bootblock auf Schirm od. in File!  Standard,NoFastMem od. File auf Bootblock!",10
  419.  dc.b "Bootblockchecksum falsch->k.(Virus-)Boot mehr, richtig->(Virus-)Boot möglich!",10
  420.  dc.b "gefahrloses Booten  von Virus-Diskette  durch Bootsimulation!",10
  421.  dc.b "Bootblock    nach   S:NoWarning     -> nur rotes Warn-Signal!",10
  422.  dc.b "Bootblock mit Namen nach S:VirusName-> namentliche   Warnung!",10
  423.  dc.b "Link-Viren-Schutz    durch   File-Schutz-Kennung!",10
  424.  dc.b "-f  S:NoWarning, S:VirusName  nicht  durchsuchen!",10
  425.  dc.b "-c  kein  grünes  Farb-Signal  bei Disk-Einlegen!",10
  426.  dc.b "-t  bei Programmstart  eingelegte Disks n.testen!",10
  427.  dc.b "-o  File-Zugriff mittels Requester kontrollieren!",10
  428.  dc.b "Kontakte und Mitteilungen  aller  Art  erwünscht!",10
  429. MeldungEnde: even
  430. MeldungDanger:
  431.  dc.b $9b,"33mVIRUS-CONTROL V1.3 von P.NIPPGEN  nicht installiert,",10,
  432.  dc.b $9b,"31mda "
  433. vektorchanged: ; vektorchanged-Adresse muß gerade sein, da .l daraufzugreife
  434.  dc.b    "COOL-Vektor schon verbogen -> durch  ein VIRUS ?",10
  435.  dc.b "die einzig 100 % sichere Virus-Entfern-Methode ist:",10
  436.  dc.b "AMIGA AUS, Warten, Amiga an, VIRUS-CONTROL starten!",10
  437. MeldungDangerEnde: even
  438. MeldungVektor: dc.b $9b,"33mKICK   -Vektor verändert -> Virus ?",10,$9b,"31m"
  439. MeldungVektorEnde: even
  440. NoWBStart:
  441.  dc.b 0,1,0,0
  442.  dc.w 15,30
  443.  dc.l 0,NoWBStarttext,0
  444. NoWBStarttext:
  445.  dc.b "VIRUS-CONTROL V1.3 von P.NIPPGEN nur im CLI startbar !",0
  446.  even
  447.  
  448. ; in der eigentlichen VIRUS-CONTROL-Routine (reset: bis end:), welche in
  449. ; den angeforderten Speicherbereich kopiert wurde, darf ich nicht absolut
  450. ; adressieren, da nach dem Kopieren die absoluten Adressen ja nicht mehr
  451. ; stimmen, deshalb nur relativ adressieren:
  452. ; z.B. move adresse(pc),lea(pc),bsr,bra  statt  move adresse,lea,jsr,jmp
  453. reset:                 ; RESET-Routine, wird über Cool-Vektor bei Reset
  454.  btst    #6,$bfe001    ; angesprungen, wenn execchecksum korrekt.
  455.  bne.s   weiter        ; wenn linke Maustaste während Reset gedrückt,
  456.  clr.l   $2e(a6)       ; wird VIRUS-CONTROL entfernt.
  457.  rts
  458. weiter:
  459.  movem.l d0-d7/a0-a6,-(sp); alle Register retten
  460.  move.l  pointer(pc),a1
  461.  move.l  #end-reset+9000,d0
  462.  jsr     -204(a6)      ; mit AllocAbs den früheren Speicherbereich, worin sich
  463.  tst.l   d0            ; VIRUS-CONTROL befindet, wieder belegen,
  464.  bne.s   AllocAbsOkay  ; in der COOL-Routine sind noch keine Libraries, außer
  465. showend:               ; der Exec-Library installiert. Auch ist noch kein
  466.  bsr     optzeichen    ; eventuelles Expansion-Ram eingebunden. Deshalb
  467.  bra.s   showend       ; Chip-Memory für VIRUS-CONTROL brnutzen.
  468. AllocAbsOkay:          ; AllocAbs klappt, da es sehr früh aufgerufen wird.
  469.  lea     taskflag(pc),a0  ; taskflag, resetflag, exitflag, exitcount löschen
  470.  clr.l   (a0)+            ; inuse-flags löschen,
  471.  clr.l   (a0)             ; taskflag, exitcount, inuse-flags löschen reicht
  472.  bsr     VCrestore        ; Vektoren auf VIRUS-CONTROL verbiegen
  473.  bsr     optzeichen       ; grünes Farbsignal -> VIRUS-CONTROL noch aktiv
  474.  movem.l (sp)+,d0-d7/a0-a6; coolvektor, execchecksum bleibt bei reset erhalten
  475.  rts                      ; reicht also 1* bei CLI-aufruf
  476.  
  477. newDOIO: ; neuer Einsprung der DOIO-Routine. Code, der bei jedem DOIO-Aufruf
  478.          ; durchlaufen wird, möglichst kurz halten, um Absturz durch
  479.          ; DOIO-Aufruf-Stau zu verhindern !!
  480.  cmp.l   #$400,36(a1)   ; 1024 Bytes bei reset
  481.  beq.s   test
  482.  cmp.l   #$200,36(a1)   ; 512 Bytes bei Disk einlegen und loadwb
  483.  beq.s   test
  484.  bra     jmpoldDOIO     ; in alte DOIO-Routine einspringen
  485. ; Der Code der neuen DOIO-Routine muß reentrant sein, da ja bis zu 4 Mal
  486. ; (=für jedes Laufwerk) aufgerufen werden kann. Daher darf ich nicht eine
  487. ; absolute Speicherstelle als Speicher für gadgetID, windowpointer o.ä.
  488. ; benutzen, da ja alle 4 möglichen Tasks auf diese eine Speicherstelle
  489. ; zugreifen würden -> Fehler. Deshalb diese Werte einfach in unbenutzten
  490. ; Register ablegen, denn diese werden ja mit Taskwechsel umgeladen,
  491. ; so daß automatisch immer die jeweils richtigen Werte in den Registern
  492. ; vorhanden sind. Da die Betriebssystemroutinen des öftern zumindest
  493. ; a0,a1,d0,d1 ändern, sicherheitshalber immer vor Aufruf Register retten.
  494. ; die Register werden folgendermaßen zur Speicherung benutzt:
  495. ; d6 = Laufwerknummer des jeweiligen DOIO-Aufrufs (um Texte zu modifizieren)
  496. ; d4 = IDCMPclass, d5 LowWord=gadgetID, d5 HiWord= 1Unterschied ausgeben
  497. ; d7 = Windowpointer, a5 = bootblockpuffer
  498. ; Um Speicherplatz zu sparen werden die Textmeldungen vor der Textausgabe
  499. ; jeweils für das aktuelle Laufwerk modifiziert. Ich muß deshalb vor der
  500. ; Textmodifizierung das Multitasking abschalten und erst nach der Textausgabe
  501. ; wieder einschalten. Dadurch wird das Umschalten auf einen andreren Task
  502. ; verhindert, welcher einen nicht für ihn modifizierten Text ausgeben könnte.
  503. test:
  504.  movem.l d0-d7/a0-a6,-(sp); alle Register retten
  505.  move.l  $4.w,a6        ; kann auch DOIO mit execbase in z.B. a5 aufrufen
  506.  move.l  20(a1),a0      ; in a1 Zeiger auf I/O-Request-Struktur
  507.  move.l  10(a0),a0      ; in 20(a1) Adresse der Device-Struktur, diese beginnt
  508.  cmp.l   #"trac",(a0)+  ; mit einer Node-struktur, deren Namen prüfen
  509.  bne.s   shorter4       ; DOIO-Zugriff auf Trackdisk.device ?
  510.  cmp.l   #"kdis",(a0)+
  511.  bne.s   shorter4
  512.  cmp.l   #"k.de",(a0)
  513.  bne.s   shorter4
  514.  tst.l   44(a1)         ; ab Block 0 ?
  515.  bne.s   shorter4
  516.  cmp.w   #$02,28(a1)    ; wird gelesen ?
  517.  beq.s   read3
  518.  cmp.w   #$03,28(a1)    ; wird geschrieben ? -> Gefahrmeldung in bootblockread
  519. shorter4:               ; bne.s shorter4 = 2 Byte, bne.l DOIOweiter = 4 Byte
  520.  bne     DOIOweiter1
  521. read3:
  522.  move.l  24(a1),a0      ; OpenDevice() trug in IO_UNIT die Adresse des
  523.  move.b  67(a0),d0      ; MsgPort des Laufwerks ein.
  524.  move.b  d0,d6          ; Laufwerknummer in d6 ablegen
  525.  btst    #1,64(a0)      ; wenn Laufwerk leer, da ja DOIO auf leeres Laufwerk
  526.  bne     shorter4       ; machen kann, siehe check:
  527.  lea     inuse0(pc),a0
  528.  ext.w   d6             ; da in d6 nur Byte abgespeichert wurde, dieses Byte
  529.  ext.l   d6             ; auf Wordbreite, und dann auf Longwordbreite bringen,
  530.  add.l   d6,a0          ; wegen add.l
  531.  tst.b   (a0)           ; inuse-Flag des Laufwerkes testen
  532.  bne     shorter4       ; Ende, wenn schon Warn-Window für Laufwerk aufgerufen
  533.  move.b  #$ff,(a0)      ; inuse-Flag setzen
  534.  lea     exitcount(pc),a0 ; exitcount +1 wenn Diskette bearbeitet wird
  535.  addq.b  #1,(a0)
  536.  moveq   #0,d5          ; damit bei -f nichts in Window ausgegeben wird
  537.  bsr     bootblockread  ; bootblock einlesen, und auf Schreibzugriff prüfen
  538.  bsr     nameunknown    ; alter virusname mit unknown überschreiben
  539.  cmp.l   #$400,36(a1)   ; 1024 Bytes bei reset, setzt resetflag, wenn aus ROM
  540.  beq.s   checkiton
  541.  lea     resetflag(pc),a0
  542.  move.b  (a0),d0        ; den ersten DOIO-Zugriff 512 Bytes ab 0 ignorieren,
  543.  clr.b   (a0)           ; da die meisten dos.library-Funktionen noch nicht
  544.  tst.b   d0             ; benutzbar sind, z.B. Open() führt zu Task-Held
  545.  bne     DOIOweiter
  546.  cmp.b   #$35,$bfec01   ; rechte Alt-Taste gedrückt ?
  547.  beq     DOIOweiter     ; R-ALT -> kein VIRUS-CONTROL-Test
  548.  lea     colorflag(pc),a0
  549.  tst.b   (a0)
  550.  beq.s   nocolor        ; kein optisches Zeichen wenn Colorflag = 0
  551.  bsr     optzeichen
  552. nocolor:
  553.  cmp.b   #$37,$bfec01   ; linke Alt-Taste gedrückt ?
  554.  beq     VirusNameFile  ; L-ALT -> immer Warn-Window
  555. checkiton:
  556.  move.l  a5,a0          ; in bootblockread wurde Pufferadresse in a5 abgelegt
  557.  cmp.l   #$444f5300,(a0); "DOS",0 ?
  558.  bne     DOIOweiter     ; keine DOS-Disk
  559.  bsr     bootchecksum   ; Bootblockchecksum falsch, keine Gefahr, da kein Boot
  560.  bne     DOIOweiter     ; in oldDOIO wird wieder erster Block gelesen
  561.  ; es liegt DOS-Kennung vor und CHECKSUM stimmt, d.h. Bootroutine würde aus-
  562.  ; geführt werden, daher jetzt noch prüfen, ob womöglich VIRUS-code.
  563.  ; dieses zusätzliche Lesen stört nicht weiter, da Amiga ja immer ganzen Track
  564.  ; in einen TrackPuffer liest. Es wird also schnell aus Trackpuffer gelesen.
  565.  move.l  a5,a0
  566.  add.l   #12,a0
  567.  cmp.l   #$43fa0018,(a0)+ ; (a0)+ kürzer wie z.B. 12(a0)
  568.  bne.s   testreset      ; und prüfen, ob es sich um den ungefährlichen
  569.  cmp.l   #$4eaeffa0,(a0)+
  570.  bne.s   testreset      ; Standard-Bootcode handelt
  571.  cmp.l   #$4a80670a,(a0)+
  572.  bne.s   testreset
  573.  cmp.l   #$20402068,(a0)+
  574.  bne.s   testreset
  575.  cmp.l   #$00167000,(a0)+
  576.  bne.s   testreset
  577.  cmp.l   #$4e7570ff,(a0)+
  578.  bne.s   testreset
  579.  cmp.l   #$60fa646f,(a0)
  580. testreset:
  581.  jsr     -528(a6)        ; getcc() damit Prozessor-aufwärtskompatibel
  582.  move.w  d0,-(sp)        ; Flags retten, beq=kein virus  bne=virus
  583.  cmp.l   #$400,36(a1)    ; 1024 Bytes=reset. bei Disk einlegen + loadwb = 512
  584.  bne     nobootroutine
  585.  move.l  62(sp),a0       ; RTS-Adresse prüfen, ob DOIO-Aufruf aus ROM.
  586.  cmp.l   #$00fc0000,a0   ; in ROM wird nur 1* DOIO mit $400 aufgerufen,
  587.  blo     nobootroutine   ; und zwar in Bootroutine. Da aber auch jmp DOIO
  588.  cmp.w   #$4a80,(a0)     ; durch ein Programm denkbar, könnte auf Stack
  589.  bne     nobootroutine   ; zufällig ROM-Adresse liegen, deshalb noch Code
  590.  cmp.l   #$2014b0ba,4(a0); vergleichen. Um möglichst ROM-Version-unabhängig
  591.  bne     nobootroutine   ; zu sein, ist dieser umständliche Weg nötig.
  592.  ; hier in der Bootroutine sind bereits alle Libraries benutzbar, außer der
  593.  ; dos.library, da die Vorbereitungen zum Öffnen der dos.library erst durch
  594.  ; das Ausführen des Bootblockcodes getätigt werden. Die intuition.library
  595.  ; (z.B. Autorequester) ist also voll benutzbar, man muß nur bedenken, daß
  596.  ; die 'system-configuration' noch nicht ausgewertet wurde, daß also noch die
  597.  ; Standardwerte eingestellt sind, so z.B. Topaz 9 -> 60 Zeichen-Zeilenbreite
  598.  ; die Requesterstrukturen also auf 60 Zeichen-Zeilenbreite auslegen bzw.
  599.  ; als font topaz80 einsetzen.
  600.  lea     resetflag(pc),a3
  601.  move.b  #$ff,(a3)      ; resetflag setzen
  602.  cmp.w   #$100,$dff016  ; rechte Maustaste gedrückt ?
  603.  bne.s   memokay
  604. fastaway:
  605.  move.l  #$20004,d1     ; größter Fastmem-Speicherbereich ermitteln
  606.  movem.l d1-d7/a0-a6,-(sp)
  607.  jsr     -216(a6)       ; availmem()
  608.  movem.l (sp)+,d1-d7/a0-a6
  609.  tst.l   d0
  610.  beq.s   memokay
  611.  movem.l d1-d7/a0-a6,-(sp)
  612.  jsr     -198(a6)       ; diesen Bereich mittels allocmem() belegen
  613.  movem.l (sp)+,d1-d7/a0-a6
  614.  tst.l   d0             ; da ich die Anfangsadressen der belegten Speicher-
  615.  bne.s   fastaway       ; bereiche nicht rette, bleibt Fastmem bis zum
  616. memokay:                ; nächsten Reset belegt
  617.  move.w  (sp)+,ccr
  618.  beq.s   bootsimul      ; geht schneller als nochmal laden
  619.  movem.l a0-a3,-(sp)    ; a0 wegen modifyunit retten, a1,a2,a3 retten, weil
  620.  jsr     -132(a6)       ; hierin Requesterparameter übergebe
  621.  bsr     modifyunit
  622.  lea     NOBOOTtext(pc),a0
  623.  clr.b   26(a0)         ; 'String' kürzen
  624.  lea     BOOT(pc) ,a1
  625.  lea     BOOTL(pc),a2
  626.  lea     BOOTR(pc),a3
  627.  bsr     autorequest
  628.  move.b  #" ",26(a0)    ; 'String' wiederherstellen, da ganz für Window brauche
  629.  jsr     -138(a6)
  630.  movem.l (sp)+,a0-a3    ; true  1  retry  = linkes  Gadget
  631.  tst.l   d0             ; false 0  cancel = rechtes Gadget
  632.  beq.s   bootsimul      ; links -> Bootsimulation
  633.  movem.l a0-a3,-(sp)
  634.  jsr     -132(a6)
  635.  bsr     modifyunit
  636.  lea     REALLYBOOT(pc),a1
  637.  lea     BOOTL(pc),a2
  638.  lea     BOOTR(pc),a3   ; wirklich echte Disk-Boot-Routine ?
  639.  bsr     autorequest    ; gefährlich, da so Viren aktiviert werden können!
  640.  jsr     -138(a6)
  641.  movem.l (sp)+,a0-a3
  642.  tst.l   d0
  643.  beq.s   bootsimul
  644.  movem.l d0-d7/a0-a6,-(sp); da beim Booten dos.library noch nicht benutzbar,
  645.  bsr     settimer         ; anstatt Delay()  timer.device direkt mittels DOIO
  646.  bsr     wait1            ; ansprechen -> 2 sec. warten, in dieser Zeit können
  647.  bsr     wait1            ; Screen,Windowlisten usw. aktualisiert werden.
  648.  bsr     remreqport       ; allerdings ist diese Wartezeit nur bei ganz wenigen
  649.  bsr     addtask          ; unsauber programmierten BootIntros erforderlich.
  650.  movem.l (sp)+,d0-d7/a0-a6
  651.  bra     DOIOweiter ; echte Bootblockdaten von Disk lesen, welche AmigaDOS
  652.                     ; dann ausführt, und dadurch womöglich Virus aktiviert
  653. bootsimul:
  654.  bsr     addtask
  655.  move.l  40(a1),a0
  656.  move.l  a0,a2
  657.  bsr     clear1024
  658.  lea     bootblock(pc),a0
  659.  moveq   #bootblockend-bootblock-1,d0
  660. loop6:
  661.  move.b  (a0)+,(a2)+
  662.  dbra    d0,loop6
  663.  bsr     clearflags
  664.  movem.l (sp)+,d0-d7/a0-a6
  665.  moveq   #$0,d0 ; rts nach $fea806(V1.2) mit d0=0 -> DOIO okay, also anstatt
  666.  rts     ; mittels jmp oldDOIO Daten von Disk in Puffer zu lesen, gefahrloser
  667.          ; Bootcode in Puffer kopieren, den AmigaDOS dann ruhig ausführen kann
  668. nobootroutine:
  669.  move.w  (sp)+,ccr
  670.  beq     DOIOweiter        ; kein Virus
  671.  lea     searchfiles(pc),a0
  672.  tst.b   (a0)              ; S:NoWarning, S:VirusName nicht durchsuchen,
  673.  beq     openwindow        ; wenn searchfiles = 0
  674.  ; prüfen, ob Bootblock in NoWarning-File enthalten, wenn ja nur rotes Signal
  675.  movem.l d0-d7/a0-a6,-(sp)
  676.  bsr     OpenDOS           ; OpenLibrary("dos.library",0);
  677.  lea     NoWarning(pc),a0
  678.  move.l  a0,d1             ; Filename-Adresse nach d1
  679.  move.l  #1004,d2          ; MODE_READWRITE, um bestehendes S:NoWarning-File
  680.  bsr     checkdevicename   ; zu öffnen,EXCLUSIVE_LOCK nötig, um Schreibzugriffe
  681.  tst.l   d0                ; durch andere 'Laufwerk-Aufrufe' auszuschließen,
  682.  beq     NoWarnError       ; denn dadurch könnten falsche Daten gelesen werden.
  683.  movem.l d1-d7/a0-a6,-(sp)
  684.  jsr     -30(a6)
  685.  movem.l (sp)+,d1-d7/a0-a6 ; OpenError,weil z.B. nicht existiert
  686.  tst.l   d0                ; oder weil z.B. schon von anderem 'Laufwerk-Aufruf'
  687.  beq     NoWarnError       ; EXKLUSIVE geöffnet wurde
  688.  move.l  d0,d1             ; filehandle
  689. nextbootblock:
  690.  move.l  a5,a2
  691.  lea     Nobuff(pc),a0
  692.  move.l  a0,d2             ; Vektor-Kontroll-Task-Stackboden
  693.  move.l  #1024,d3          ; als 1024-Puffer benutzen
  694.  movem.l d1-d7/a0-a6,-(sp)
  695.  jsr     -42(a6)           ; ersten Bootblock aus S:NoWarning lesen
  696.  movem.l (sp)+,d1-d7/a0-a6
  697.  cmp.l   #1024,d0          ; kein Bootblock mehr zu lesen -> Fileende
  698.  bne.s   fileende
  699.  move.w  #$ff,d0
  700. NoWarningloop:
  701.  cmpm.l  (a0)+,(a2)+
  702.  bne.s   nextbootblock
  703.  dbra    d0,NoWarningloop
  704.  bsr     CloseFile         ; 1024 Bytes gleich -> gefunden !
  705.  move.l  #$0f000f00,d0     ; rotes Signal für gefunden
  706.  bsr     optzeichen2
  707.  movem.l (sp)+,d0-d7/a0-a6
  708.  bra     DOIOweiter
  709. fileende:                  ; nicht gefunden !
  710.  bsr     CloseFile         ; Close File + Close dos.library
  711.  bra.s   allclosed
  712. NoWarnError:
  713.  bsr     CloseDOS          ; Close dos.library
  714. allclosed:
  715.  movem.l (sp)+,d0-d7/a0-a6
  716.  
  717. VirusNameFile:
  718.  ; bevor Warn-Window öffne, prüfen, ob Bootblock in VirusName-File enthalten,
  719.  ; wenn ja VirusName entsprechend setzen
  720.  lea     searchfiles(pc),a0 ; wenn -f auch bei L-ALT nicht durchsuchen
  721.  tst.b   (a0)               ; wenn searchfiles = 0
  722.  beq     openwindow
  723.  movem.l d0-d7/a0-a6,-(sp)
  724.  bsr     nameunknown       ; als Name unbekannt vorbelegen
  725.  bsr     OpenDOS           ; OpenLibrary("dos.library",0);
  726.  lea     VirusName(pc),a0
  727.  move.l  a0,d1             ; Filename-Adresse nach d1
  728.  move.l  #1004,d2          ; MODE_READWRITE, um bestehendes S:VirusName-File
  729.  bsr     checkdevicename   ; zu öffnen,EXCLUSIVE_LOCK nötig, um Schreibzugriffe
  730.  tst.l   d0                ; durch andere 'Laufwerk-Aufrufe' auszuschließen,
  731.  beq     OpenFailed        ; denn dadurch könnten falsche Daten gelesen werden.
  732.  movem.l d1-d7/a0-a6,-(sp)
  733.  jsr     -30(a6)
  734.  movem.l (sp)+,d1-d7/a0-a6 ; OpenError,weil z.B. nicht existiert
  735.  tst.l   d0                ; oder weil z.B. schon von anderem 'Laufwerk-Aufruf'
  736.  beq     OpenFailed        ; EXKLUSIVE geöffnet wurde
  737.  move.l  d0,d1             ; filehandle
  738. nextbootblock1:
  739.  clr.b   20(sp)               ; 20(sp) = d5 nach movem, GadgetID erst später
  740.  lea     Vibuff(pc),a0
  741.  move.l  a0,d2                ; Vektor-Kontroll-Task-Stackboden
  742.  move.l  #1024+buff1-buff0,d3 ; als 1024+32-Puffer benutzen
  743.  movem.l d1-d7/a0-a6,-(sp)
  744.  jsr     -42(a6)              ; 1 Virusname+Bootblock aus S:VirusName lesen
  745.  movem.l (sp)+,d1-d7/a0-a6
  746.  cmp.l   #1024+buff1-buff0,d0
  747.  bne.s   fileende1            ; Fileende
  748.  lea     NAME0text(pc),a2
  749.  moveq   #buff1-buff0+20,d0   ; Virusname in entsprechende Intuitext-struktur
  750.  mulu    d6,d0                ; kopieren, wird später in geöffnetes Window
  751.  add.l   d0,a2                ; geprintet
  752.  bsr     copyname
  753.  move.w  #$ff,d0
  754.  move.l  a5,a2
  755. VirusNameloop:
  756.  cmpm.l  (a0)+,(a2)+
  757.  beq.s   issame
  758.  cmp.l   #"FREE",-4(a0)
  759.  beq.s   nextbootblock1
  760.  tst.b   20(sp)
  761.  bne.s   nextbootblock1
  762. countit:                   ; 1 Longword-Unterschied erlauben
  763.  move.b  #$ff,20(sp)       ; Flag für 1 Longword-Unterschied
  764. issame:
  765.  dbra    d0,VirusNameloop  ; 1024 Bytes gleich -> gefunden !
  766.  bra.s   CloseFileDOS
  767. fileende1:                 ; nicht gefunden !
  768.  bsr     nameunknown       ; als Name unbekannt setzen
  769. CloseFileDOS:
  770.  bsr     CloseFile         ; Close File + Close dos.library
  771.  bra.s   allclosed1
  772. OpenFailed:
  773.  bsr     CloseDOS          ; Close dos.library
  774. allclosed1:
  775.  movem.l (sp)+,d0-d7/a0-a6
  776.  bra     openwindow
  777.  
  778. Checksumfalsch:
  779.  move.l  24(a1),a0      ; falsche Bootblock-Checksum schreiben -> inaktiviert
  780.  btst    #4,64(a0)      ; Bootblock-Virus, da kein Boot mehr möglich.
  781.  ; zuvor prüfen, ob Disk schreibgeschützt, OpenDevice() trug in IO_UNIT die
  782.  ; Adresse des MsgPort des Laufwerks ein. In Byte 64 des MsgPort steht ein
  783.  ; gesetztes Bit 4 für eine schreibgeschützte Disk.
  784.  beq.s   noprotect
  785.  bsr.s   writeprotected ; schreibgeschützt -> Requester ausgeben
  786.  bne.s   Checksumfalsch ; neuer Versuch
  787.  rts
  788. noprotect:
  789.  bsr     setchecksum    ; richtige Bootblockchecksum setzen
  790.  addq.l  #1,4(a0)       ; richtige checksum durch +1 falsch machen
  791. writecheck:
  792.  bra     bootblockwrite ; auf Disk schreiben
  793.  
  794. Checksumrichtig:
  795.  move.l  24(a1),a0
  796.  btst    #4,64(a0)
  797.  beq.s   noprotect1
  798.  bsr.s   writeprotected
  799.  bne.s   Checksumrichtig
  800.  rts
  801. noprotect1:
  802.  bsr     setchecksum    ; richtige Checksum setzen
  803.  bra.s   writecheck
  804.  
  805. writeprotected:
  806.  movem.l a0-a3,-(sp)    ; Requester, der erscheint,
  807.  jsr     -132(a6)       ; wenn Disk schreibgeschützt
  808.  bsr     modifyunit
  809.  lea     PROTECT(pc) ,a1; mit forbid() permit() umschließen, damit der
  810.  lea     PROTECTL(pc),a2; modifizierte Text auch vom dem richtigen Task
  811.  lea     NOBOOTR(pc) ,a3; ausgegeben wird.
  812.  bra     shorter2
  813.  
  814. showbootblock:             ; Bootblock-ASCII-Dump, wenn a4(=Filename) mit RAW:
  815.  movem.l d0-d7/a0-a6,-(sp) ; beginnt, andernfalls abspeichern in File
  816.  jsr     -132(a6)
  817.  bsr     modifyunit
  818.  bsr     OpenDOS           ; OpenLibrary("dos.library",0);
  819.  move.l  a4,d1             ; showbootblock wird mit filename in a4 aufgerufen
  820.  move.l  #1006,d2          ; newmode, da u.U. auch richtiges File öffnen muß
  821.  bsr     checkdevicename   ; oldmode würde dann Absturz bewirken
  822.  tst.l   d0
  823.  bne.s   deviceokay
  824.  movem.l d1-d7/a0-a6,-(sp)
  825.  bra.s   deviceunknown
  826. deviceokay:
  827.  movem.l d1-d7/a0-a6,-(sp)
  828.  jsr     -30(a6)           ; Open()
  829. deviceunknown:
  830.  move.l  $4.w,a6           ; Open() (wenn RAW:-Window->modifizierter Titel)
  831.  jsr     -138(a6)
  832.  movem.l (sp)+,d1-d7/a0-a6 ; DOIO->writeprotect->eigener requester
  833.  tst.l   d0                ; DOSfunctions->writeprotect->AmigaDOSAutorequester
  834.  bne.s   NoErrorShow       ; OpenError(falscher filename)->eigener requester
  835.  bsr     openerror
  836.  bra     OpenFailed
  837. NoErrorShow:
  838.  move.l  d0,d1             ; filehandle für späteres write() und close() retten
  839.  bsr     WriteInFile       ; Puffer, welcher ersten Block enthält ausgeben
  840.  cmp.l   #"RAW:",(a4)
  841.  bne     CloseFileDOS
  842.  lea     unit2(pc),a0      ; z.B. unit2 als Puffer für das eingegebene Zeichen
  843.  move.l  a0,d2             ; benutzen, da ja wieder restauriert wird
  844.  moveq   #1,d3             ; 1 Zeichen holen
  845.  movem.l d0-d7/a0-a6,-(sp)
  846.  jsr     -42(a6)           ; Read  aus RAW:  wartet auf Eingabe,
  847.  movem.l (sp)+,d0-d7/a0-a6
  848.  bsr     CloseFile
  849.  movem.l (sp)+,d0-d7/a0-a6; a1-IORequest restaurieren
  850.  bsr     bootblockread    ; da durch ASCII-Ausgabe Daten verändert wurden
  851.  bra     openwindow
  852.  
  853. autorequest:              ; in a6 muß exec.base stehen
  854.  movem.l d1-d7/a0-a6,-(sp)
  855.  movem.l a1-a3,-(sp)      ; Haupttext, linker Text, rechter Text
  856.  bsr     OpenIntuition
  857.  jsr     -342(a6)         ; WBenchToFront()
  858.  sub.l   a0,a0            ; 2 Bytes statt  6 Bytes(move.l #0,a3)
  859.  movem.l (sp)+,a1-a3      ; Haupttext, linker Text, rechter Text
  860.  moveq   #0,d0            ; keine IDCMP-Flags für linken Knopf
  861.  moveq   #0,d1            ; keine IDCMP-Flags für rechten Knopf
  862.  move.l  #640,d2          ; Autorequester-Breite
  863.  moveq   #100,d3          ; Autorequester-Höhe
  864.  jsr     -348(a6)         ; AutoRequest()
  865.  move.l  a6,a1            ; intuitionbase
  866.  move.l  $4.w,a6
  867.  move.l  d0,-(sp)         ; BOOL retten
  868.  jsr     -414(a6)         ; CloseLibrary("intuition.library");
  869.  move.l  (sp)+,d0         ; BOOL-Wert
  870.  movem.l (sp)+,d1-d7/a0-a6; d0-Rückgabewert darf durch movem nicht
  871.  rts                      ; überschrieben werden
  872.  
  873. optzeichen:
  874.  move.l  #$00f000f0,d0 ; green green -> VirusControl arbeitet korrekt
  875. optZeichen2:           ; Farb-Signal-Routine erwartet Farbwert in d0
  876.  movem.l d0-d7/a0-a6,-(sp)
  877.  move.l  $4.w,a6       ; Disable(), damit permanent Register beschreiben kann,
  878.  jsr     -120(a6)      ; -> Copperlist wird praktisch nicht wirksam
  879.  move.w  #40,d1        ; als 'Timer' vertikale Strahlenposition benutzen,
  880. red:                   ; da Prozessor-unabhängig und bereits in Cool-Routine
  881.  move.b  $dff005,d2    ; abfragbar, im Gegensatz zu CIA-Timer, welche erst in
  882. waittick:              ; folgender initcode()-Funktion initialisiert werden
  883.  move.l  d0,$dff180
  884.  move.l  d0,$dff184    ; alle 4 Workbenchfarben mit Farbe überschreiben
  885.  cmp.b   $dff005,d2
  886.  beq.s   waittick
  887.  dbra    d1,red
  888.  jsr     -126(a6)      ; Enable()
  889.  movem.l (sp)+,d0-d7/a0-a6
  890.  rts
  891.                        ; erwartet in a6 exec.base in a1 IO-Request
  892. bootblockread:         ; verändert a0,d0, setzt a5
  893.  moveq   #0,d0         ; Requester bei Schreibzugriff ausgeben
  894. bb:
  895.  move.l  36(a1),-(sp)  ; ursprüngliche Byte-anzahl retten
  896.  move.l  40(a1),-(sp)  ; ursprünglichen Puffer retten
  897.  tst.l   d0
  898.  bne.s   readaccess    ; write ohne Requester
  899.  cmp.w   #$02,28(a1)   ; wird gelesen ?
  900.  beq.s   readaccess
  901.  bsr     writebbzugriff
  902.  bne.s   changetoread
  903.  add.l   #12,sp        ; Stack korrigieren
  904.  bra     DOIOweiter    ; schreiben -> weiter in alter DOIO-routine
  905. changetoread:
  906.  move.w  #$02,28(a1)   ; in Lesen wandeln
  907. readaccess:
  908.  lea     bootblock0(pc),a0
  909.  move.l  #bootblock1-bootblock0,d0
  910.  mulu    d6,d0
  911.  add.l   d0,a0
  912.  move.l  a0,a5         ; aktueller bootblockpuffer in a5 abspeichern
  913.  move.l  a0,40(a1)     ; je nach Laufwerk entsprechenden Puffer setzen
  914.  move.l  #1024,36(a1)  ; 1024(=ganzer Bootblock) lesen
  915.  movem.l d1-d7/a0-a6,-(sp)
  916.  bsr     jmpoldDOIO
  917.  movem.l (sp)+,d1-d7/a0-a6
  918.  tst.l   d0
  919.  beq.s   bootblockreadokay
  920.  bsr     openerror
  921. bootblockreadokay:
  922.  move.l  (sp)+,40(a1)  ; ursprünglichen Puffer restaurieren
  923.  move.l  (sp)+,36(a1)  ; ursprüngliche Byte-anzahl restaurieren
  924.  rts
  925.  
  926. bootblockwrite:        ; erwartet in a6 exec.base in a1 IO-Request
  927.  move.l  24(a1),a0     ; verändert a0,d0, setzt a5
  928.  btst    #4,64(a0)
  929.  beq.s   noprotect3
  930.  bsr     writeprotected; wenn Disk schreibgeschützt oder aus Laufwerk entnommen
  931.  bne.s   bootblockwrite
  932.  rts
  933. noprotect3:
  934.  moveq   #-1,d0        ; write ohne Requester
  935.  move.w  #3,28(a1)     ; 3 = CMD_WRITE
  936.  bsr     bb
  937.  move.w  #2,28(a1)     ; 2 = CMD_READ
  938.  rts
  939. ; Wenn ich mittels DOIO schreibend auf Disk zugreifen will, dann muß ich
  940. ; selber vorher prüfen, ob Disk schreibgeschützt ist. Wenn ja eigener
  941. ; Autorequester ausgeben, denn AmigaDOS prüft dies nur bei Open()-Funktion
  942.  
  943. bootchecksum:          ; erwartet in a0 Adresse des Datenpuffers
  944.  move.w  #$ff,d1       ; ändert a0, d0,d1
  945.  moveq   #$0,d0        ; rts mit bootblockchecksum in d0
  946. loop:
  947.  add.l   (a0)+,d0
  948.  bcc.s   jump
  949.  addq.l  #1,d0
  950. jump:
  951.  dbra d1,loop
  952.  not.l   d0
  953.  rts
  954.  
  955. setchecksum:
  956.  move.l  a5,a0
  957.  clr.l   4(a0)         ; alte Bootblockchecksum löschen
  958.  bsr.s   bootchecksum  ; neue richtige Bootblockchecksum berechnen
  959.  move.l  a5,a0
  960.  move.l  d0,4(a0)      ; und die richtige Bootblockchecksum eintragen
  961.  rts
  962.  
  963. WriteInFile:           ; verändert a0, d0,d1,d2,d3
  964.  move.l  a5,d2         ; d2 = Adresse des Puffers der auszugebenden Bytes
  965.  move.l  #1024,d3      ; d3 = Anzahl der auszugebenden Bytes
  966.  move.w  #1023,d0      ; 1024-1 Zähler für dbra modifybuffer
  967.  move.l  d2,a0
  968. modifybuffer:
  969.  cmp.l   #"RAW:",(a4)  ; wenn Filename nicht mit "RAW:" anfängt, also wenn
  970.  bne.s   writeokay     ; keine Ausgabe auf Schirm, dann nicht wandeln
  971.  cmp.b   #$20,(a0)
  972.  blo.s   writedefault
  973.  cmp.b   #127,(a0)
  974.  blo.s   writeokay
  975. writedefault:          ; wenn Byte < 32  oder Byte > 126, dann . ausgeben
  976.  move.b  #".",(a0)
  977. writeokay:
  978.  addq.l  #1,a0
  979.  dbra    d0,modifybuffer
  980.  movem.l d0-d7/a0-a6,-(sp)
  981.  jsr     -48(a6)       ; Write
  982.  movem.l (sp)+,d0-d7/a0-a6
  983.  rts
  984.  
  985. modifyunit:            ; modifiziert auszugebende Texte für aktuelles Laufwerk
  986.  move.b  d6,d0         ; in d6 wird ganz am Anfang die Laufwerksnummer abgelegt
  987.  add.b   #48,d0
  988.  lea     unit0(pc),a0
  989.  move.b  d0,(a0)
  990.  lea     unit1(pc),a0
  991.  move.b  d0,(a0)
  992.  lea     unit2(pc),a0
  993.  move.b  d0,(a0)
  994.  lea     unit3(pc),a0
  995.  move.b  d0,(a0)
  996.  lea     unit4(pc),a0
  997.  move.b  d0,(a0)
  998.  lea     unit5(pc),a0
  999.  move.b  d0,(a0)
  1000.  lea     unit6(pc),a0
  1001.  move.b  d0,(a0)
  1002.  lea     unit7(pc),a0
  1003.  move.b  d0,(a0)
  1004.  lea     unit8(pc),a0
  1005.  move.b  d0,(a0)
  1006.  rts
  1007.  
  1008. DOIOweiter:
  1009.  bsr     clearflags
  1010. DOIOweiter1:
  1011.  movem.l (sp)+,d0-d7/a0-a6
  1012. jmpoldDOIO: dc.w $4ef9 ; Opcode für jmp, also in die
  1013. oldDOIO:    dc.l 0     ; Original-DOIO-Routine einspringen
  1014.  
  1015. bootblock:             ; harmloser Original-Bootblock für die Boot-Simulation
  1016.  dc.b    "DOS",0       ; wenn Bootblock ändere -> muß Bootblock-Checksum
  1017.  dc.l    $c0200f19     ; korrigieren
  1018.  dc.l    $00000370
  1019.  lea     dosname(pc),a1
  1020.  jsr     -96(a6)
  1021.  tst.l   d0
  1022.  beq.s   error
  1023.  move.l  d0,a0
  1024.  move.l  22(a0),a0
  1025. returncode:
  1026.  moveq   #0,d0
  1027. ende0:
  1028.  rts
  1029. error:
  1030.  moveq   #-1,d0
  1031.  bra.s ende0
  1032. dosname: dc.b "dos.library",0
  1033. bootblockend: even
  1034.  
  1035. nofastbootblock:       ; NoFastMem-Bootblock
  1036.  dc.b    "DOS",0
  1037.  dc.l    $9f780e84
  1038.  dc.l    $00000370
  1039.  movem.l d0-d7/a0-a6,-(sp)
  1040.  btst    #6,$bfe001
  1041.  beq.s   memokay1      ; wenn linke Maustaste während Reset drücke,
  1042. fastaway1:             ; wird kein FastMem belegt
  1043.  move.l  #$20004,d1
  1044.  movem.l d1-d7/a0-a6,-(sp)
  1045.  jsr     -216(a6)      ; availmem()
  1046.  movem.l (sp)+,d1-d7/a0-a6
  1047.  tst.l   d0
  1048.  beq.s   optzeichen1
  1049.  movem.l d1-d7/a0-a6,-(sp)
  1050.  jsr     -198(a6)      ; allocmem()
  1051.  movem.l (sp)+,d1-d7/a0-a6
  1052.  tst.l   d0
  1053.  bne.s   fastaway1
  1054. optZeichen1:           ; NoFastMem -> blaues Farb-Signal
  1055.  jsr     -132(a6)      ; Forbid(), damit permanent Register beschreiben kann,
  1056.  move.l  #$000f000f,d0 ; -> Copperlist wird praktisch nicht wirksam
  1057.  move.w  #40,d1
  1058. farbe:
  1059.  move.b  $dff005,d2
  1060. waittick1:
  1061.  move.l  d0,$dff180
  1062.  move.l  d0,$dff184    ; alle 4 Workbenchfarben mit blau überschreiben
  1063.  cmp.b   $dff005,d2
  1064.  beq.s   waittick1
  1065.  dbra    d1,farbe
  1066.  jsr     -138(a6)      ; Permit()
  1067. memokay1:
  1068.  movem.l (sp)+,d0-d7/a0-a6
  1069.  lea     dosname1(pc),a1; ab hier der eigentliche Standard-Bootblock
  1070.  jsr     -96(a6)
  1071.  tst.l   d0
  1072.  beq.s   error1
  1073.  move.l  d0,a0
  1074.  move.l  22(a0),a0
  1075.  moveq   #0,d0
  1076. ende1:
  1077.  rts
  1078. error1:
  1079.  moveq   #-1,d0
  1080.  bra.s   ende1
  1081. dosname1:dc.b "dos.library",0
  1082.  even
  1083. taskname:dc.b " VIRUS-CONTROL V1.3 von PIUS NIPPGEN, 6657 Gersheim 8,"
  1084.          dc.b " 06843/1522",0
  1085. ; Bedienungsanleitung
  1086. dc.b "wenn linke Maustaste nicht gedrueckt, wird beim Booten automatisch "
  1087. dc.b "FASTMEM abgeschaltet"
  1088. nofastbootblockend: even
  1089.  
  1090. openfile:
  1091.  cmp.b   #$39,$bfec01   ; CTRL-Taste gedrückt ?
  1092.  beq.s   jmpoldopen     ; wenn ja gleich Original-Open
  1093.  movem.l a0-a1,-(sp)
  1094.  move.l  d1,a0
  1095.  cmp.b   #"*",(a0)      ; Open "*" ignorieren
  1096.  movem.l (sp)+,a0-a1
  1097.  beq.s   jmpoldopen
  1098.  movem.l d1-d7/a0-a6,-(sp)
  1099.  moveq   #-2,d2         ; ACCESS_READ
  1100.  move.l  dosbase(pc),a6 ; da theoretisch Dosbase nicht in a6 stehen muß
  1101.  jsr     -84(a6)        ; Lock() (wenn auf RAW:Window->kurzzeitig RAW:Window)
  1102.  movem.l (sp)+,d1-d7/a0-a6
  1103.  tst.l   d0
  1104.  beq.s   jmpoldopen     ; da File noch nicht existiert -> keine Gefahr
  1105.  movem.l d1-d7/a0-a6,-(sp)
  1106.  move.l  d0,d1
  1107.  move.l  dosbase(pc),a6 ; da theoretisch Dosbase nicht in a6 stehen muß
  1108.  jsr     -90(a6)        ; Unlock()
  1109.  movem.l (sp)+,d1-d7/a0-a6
  1110.  movem.l d1-d7/a0-a6,-(sp)
  1111.  lea     opencount(pc),a0
  1112.  addq.b  #1,(a0)
  1113.  bsr     allowaccess   ; kann ewig lang dauern
  1114.  subq.b  #1,(a0)       ; VIRUS-CONTROL kann beendet werden, wenn opencount=0
  1115.  movem.l (sp)+,d1-d7/a0-a6 ; a6=execbase wieder mit dosbase belegen
  1116.  tst.l   d0
  1117.  bne.s   jmpoldopen    ; kann mittlerweile ruhig restauriert worden sein
  1118.  bra     returncode
  1119.  
  1120. jmpoldopen: dc.w 0     ; wird 'moveq #$ff,d1' reinkopiert
  1121. jmp:        dc.w $4ef9 ; Opcode für jmp
  1122. oldopen:    dc.l 0     ; in Original-Open-Routine einspringen
  1123. savebra:    dc.l 0     ; Original bra offset retten
  1124.  
  1125. ; Taskcode, welcher Systemvektoren-kontrolliert, der Task muß möglichst
  1126. ; frühzeitig und automatisch installiert werden. Dieses wird von der
  1127. ; Bootroutine gemacht. Da nur Prozesse dos.library benutzen können, muß
  1128. ; Task-waiting mittels timer.device realisieren, es werden 1* pro Sekunde
  1129. ; Vektoren überprüft, Wait wichtig, damit Systemleistung erhalten bleibt.
  1130. task:
  1131.  move.l  $4.w,a6
  1132.  bsr     settimer          ; timerdevice setzen
  1133.  lea     taskflag(pc),a0   ; bei CLI-Start nicht warten
  1134.  tst.b   (a0)              ; nach Reset mehrere Sekunden warten, damit
  1135.  bne.s   ttt               ; WorkBenchScreen offen. Wenn nicht warte, wird
  1136.  move.l  #10,32(a1)        ; ein StandardScreen geöffnet. Dadurch wird später
  1137.  bsr     wait              ; die system-configuration nicht voll ausgewertet
  1138. ttt:                       ; (Breite>640, Interlace wird nicht berücksichtigt)
  1139.  bsr     opendos           ; auch dos.library ist jetzt eingerichtet
  1140.  lea     dosbase(pc),a0
  1141.  move.l  d0,(a0)
  1142. taskweiter:
  1143.  lea     openflag(pc),a0   ; durch CLI-start oder Window-Gadget setzen
  1144.  tst.b   (a0)
  1145.  bne.s   tt
  1146.  move.l  dosbase(pc),a6
  1147.  cmp.w   #$4ef9,-30(a6)
  1148.  beq.s   tt                ; schon verbogen
  1149.  lea     jmpoldopen(pc),a0
  1150.  move.w  -30(a6),(a0)      ; moveq #$ff,d1
  1151.  lea     -26(a6),a4        ; relative Adresse in
  1152.  add.w   -26(a6),a4        ; absolute Adresse umrechnen
  1153.  move.l  a4,4(a0)
  1154.  move.l  -28(a6),8(a0)
  1155.  move.l  $4.w,a4
  1156.  exg     a4,a6
  1157.  jsr     -120(a6)          ; Disable(), da theoretisch Taskswitch nach 1 Befehl
  1158.  exg     a4,a6
  1159.  lea     openfile(pc),a0
  1160.  move.w  #$4ef9,-30(a6)    ; Open() verbiegen
  1161.  move.l  a0,-28(a6)
  1162.  exg     a4,a6
  1163.  jsr     -126(a6)          ; Enable()
  1164. tt:
  1165.  move.l  $4.w,a6
  1166.  lea     openflag(pc),a0   ; durch CLI-start oder Window-Gadget setzen
  1167.  tst.b   (a0)
  1168.  beq.s   tttt
  1169.  bsr     restoreopen       ; Open() wiederherstellen
  1170. tttt:
  1171.  bsr     wait1             ; 1 sec warten
  1172.  lea     exitflag(pc),a0   ; soll VIRUS-CONTROL entfernt werden
  1173.  tst.b   (a0)
  1174.  beq.s   noexitflag
  1175.  clr.l   $2e(a6)           ; VIRUSCONTROL wird bei nächsten Reset n.m.aktiviert
  1176.  move.l  oldDOIO(pc),-454(a6) ; DOIO-Vektor zurücksetzen -> kein Diskcheck mehr
  1177.  bsr     restoreopen       ; Open() wiederherstellen
  1178.  lea     exitcount(pc),a0
  1179.  tst.b   (a0)              ; ist noch ein Warn-Window in Arbeit ?
  1180.  bne.s   tttt              ; warten bis alle Arbeits-Windows beendet sind
  1181.  lea     opencount(pc),a0  ; sind auch alle Open()-Requester bearbeitet ?
  1182.  tst.b   (a0)              ; muß dies prüfen, da diese Routinen den
  1183.  bne.s   tttt              ; freizugebenden Speicher als Code benutzen
  1184.  move.l  #5,32(a1)         ; vor der Speicherfreigabe 5 sec. warten, damit alle
  1185.  bsr     wait              ; Routinen beendet, die den Speicherbereich benutzen
  1186.  bsr     remreqport        ; Device schließen + Port entfernen
  1187.  bra     freemem           ; Speicherfreigabe + rts->EndTask
  1188. noexitflag:
  1189.  move.l  BeginIOAdr(pc),a0
  1190.  lea     lastBeginIO(pc),a1; wenn VIRUS-CONTROL neu installiert wird,
  1191.  tst.l   (a1)              ; nach CLI-Start oder reset = 0
  1192.  bne.s   alreadyset        ; mit dem momentanen BeginIO-Vektor-Wert belegen
  1193.  move.l  (a0),(a1)+        ; momentaner BeginIO-Vektor nach lastBeginIO
  1194.  move.l  (a0),(a1)         ; momentaner BeginIO-Vektor nach restoreIO
  1195. alreadyset:
  1196.  cmp.l   #$00fc0000,(a0)   ; wenn BeginIO auf ROM zeigt (z.B. nach Reset),
  1197.  bhs.s   restoreIOROM      ; dann diesen Wert als restoreIO benutzen
  1198.  move.l  lastBeginIO(pc),a2
  1199.  lea     lastBeginIO(pc),a3
  1200.  move.l  (a0),(a3)         ; momentanen Vektor für nächsten Vergleich retten
  1201.  cmp.l   (a0),a2           ; wurde BeginIO-Vektor in letzter Sekunde verändert
  1202.  beq.s   testKICK1         ; nein, weiter mit KICK-Vektoren-Test
  1203.  lea     vektor0text(pc),a0; weil verändert, Warn-Requester ausgeben
  1204.  move.l  #"Begi",(a0)+
  1205.  move.l  #"nIO-",(a0)      ; Warn-Text an BeginIO-Vektor anpassen
  1206.  bsr     vektoropenwindow
  1207.  bra     taskweiter
  1208. restoreIOROM:              ; Original-BeginIO-Vektor wird in der deletevirus-
  1209.  lea     restoreIO(pc),a1  ; routineist benötigt. BeginIO-Vektor-Handlung etwas
  1210.  move.l  (a0),(a1)         ; aufwendiger, um ROM-Version-unabhängig zu sein
  1211.  move.l  (a0),-4(a1)
  1212. testKICK1:
  1213.  tst.l   546(a6)           ; wenn Kick-Vektor auf Null geändert wurde -> okay
  1214.  bne.s   testKICK2
  1215.  tst.l   550(a6)
  1216.  bne.s   testKICK2
  1217.  tst.l   554(a6)
  1218.  beq.s   testCool1
  1219. testKICK2:
  1220.  move.l  546(a6),a0
  1221.  move.l  lastKickMem(pc),a2
  1222.  lea     lastKickMem(pc),a3
  1223.  move.l  a0,(a3)           ; momentanen Pointer für nächsten Vergleich retten
  1224.  cmp.l   a0,a2             ; wurde KickMem-Ptr in letzten Sekunde verändert
  1225.  bne.s   kickchanged1
  1226.  move.l  550(a6),a0
  1227.  move.l  lastKickTag(pc),a2
  1228.  lea     lastKickTag(pc),a3
  1229.  move.l  a0,(a3)           ; momentanen Pointer für nächsten Vergleich retten
  1230.  cmp.l   a0,a2             ; wurde KickTag-Pointer in letzter Sekunde verändert
  1231.  bne.s   kickchanged1
  1232.  move.l  554(a6),a0
  1233.  move.l  lastKickCheck(pc),a2
  1234.  lea     lastKickCheck(pc),a3
  1235.  move.l  a0,(a3)           ; momentanen Checksum für nächsten Vergleich retten
  1236.  cmp.l   a0,a2             ; wurde KickChecksun in letzter Sekunde verändert
  1237.  beq.s   testcool1
  1238. kickchanged1:
  1239.  lea     vektor0text(pc),a0
  1240.  move.l  #"KICK",(a0)+
  1241.  move.l  #" -  ",(a0)
  1242.  bsr.s   vektoropenwindow
  1243.  bra     taskweiter
  1244. testcool1:
  1245.  move.l  pointer(pc),a2    ; Adresse von VIRUS-CONTROL nach a2
  1246.  move.l  46(a6),a0
  1247.  cmp.l   a0,a2             ; zeigt CoolVektor auf VIRUS-CONTROL ?
  1248.  beq.s   testDOIO1
  1249.  move.l  lastCOOL(pc),a2
  1250.  lea     lastCOOL(pc),a3
  1251.  move.l  a0,(a3)
  1252.  cmp.l   a0,a2             ; COOL-Vektor in letzter Sekunde verändert ?
  1253.  beq.s   testDOIO1
  1254.  lea     vektor0text(pc),a0
  1255.  move.l  #"COOL",(a0)+
  1256.  move.l  #" -  ",(a0)
  1257.  bsr.s   vektoropenwindow
  1258.  bra     taskweiter
  1259. testDOIO1:
  1260.  lea     newDOIO(pc),a2
  1261.  move.l  -454(a6),a0
  1262.  cmp.l   a0,a2             ; zeigt DOIO-Vektor auf meine (newDOIO-)Routine ?
  1263.  beq     taskweiter
  1264.  move.l  lastDOIO(pc),a2
  1265.  lea     lastDOIO(pc),a3
  1266.  move.l  a0,(a3)
  1267.  cmp.l   a0,a2             ; DOIO-Vektor in letzter Sekunde verändert ?
  1268.  beq     taskweiter
  1269.  lea     vektor0text(pc),a0
  1270.  move.l  #"DOIO",(a0)+
  1271.  move.l  #" -  ",(a0)
  1272.  bsr.s   vektoropenwindow
  1273.  bra     taskweiter
  1274.  
  1275. ; Warn-Requester ausgeben, da BeginIO-Vektor, KICK-Vektor, COOL-Vektor oder
  1276. ; DOIO-Vektor verändert, wahrscheinlich durch ein Virus.
  1277. ; Rechner ausschalten ist die beste und einfachste Heilmethode.
  1278. vektoropenwindow:
  1279.  lea     VEKTOR0(pc),a1
  1280. kill:
  1281.  lea     VEKTORL(pc),a2
  1282.  lea     NOBOOTR(pc),a3
  1283.  bsr     autorequest
  1284.  tst.l   d0
  1285.  beq.s   vektortested
  1286.  bsr     deletevirus       ; kill Virus
  1287. vektortested:
  1288.  rts
  1289.  
  1290. wait1:
  1291.  lea     timereq(pc),a1
  1292.  move.l  #1,32(a1)         ; 1 sec warten
  1293. wait:
  1294.  move.w  #9,28(a1)
  1295.  jmp     -456(a6)
  1296.  
  1297. openwindow:
  1298.  movem.l d1-d7/a0-a6,-(sp) ; a1 = IO-Request usw. retten
  1299. nopush:
  1300.  move.l  $4.w,a6          ; Forbid() -> kann ungestört entsprechendes
  1301.  jsr     -132(a6)         ; StringGadget setzen, und Gadgettext des rechten
  1302.  bsr     OpenIntuition    ; Gadgets modifizieren. Nach OpenWindow() wieder
  1303.  movem.l d1-d7/a0-a6,-(sp); permit(), da bei OpenWindow ja Ausgabe erfolgte.
  1304.  jsr     -342(a6)         ; WBenchToFront(),da bei OpenWindow nicht automatisch
  1305.  movem.l (sp)+,d1-d7/a0-a6
  1306.  lea     window(pc),a2
  1307.  tst.b   d6
  1308.  bne.s   test1
  1309.  lea     gad90(pc),a1   ; für df0:  entsprechendes Stringgadget
  1310.  move.l  a1,18(a2)      ; mit eigenem Puffer setzen
  1311. test1:
  1312.  cmp.b   #1,d6
  1313.  bne.s   test2
  1314.  lea     gad91(pc),a1   ; für df1:  entsprechendes Stringgadget
  1315.  move.l  a1,18(a2)      ; mit eigenem Puffer setzen
  1316. test2:
  1317.  cmp.b   #2,d6
  1318.  bne.s   test3
  1319.  lea     gad92(pc),a1   ; für df2:  entsprechendes Stringgadget
  1320.  move.l  a1,18(a2)      ; mit eigenem Puffer setzen
  1321. test3:
  1322.  cmp.b   #3,d6
  1323.  bne.s   testende
  1324.  lea     gad93(pc),a1   ; für df3:  entsprechendes Stringgadget
  1325.  move.l  a1,18(a2)      ; mit eigenem Puffer setzen
  1326. testende:
  1327.  move.l  34(a1),a4      ; Adresse des StringInfo
  1328.  move.l  (a4),a4        ; Adresse des Puffers(=Filename) nach a4
  1329.  bsr     modifyunit     ; modifiziert u.a. Gadgettext des rechten Gadgets
  1330.  lea     window(pc),a0
  1331.  movem.l d1-d7/a0-a6,-(sp)
  1332.  jsr     -204(a6)       ; OpenWindow(), wodurch auch Gadgets angezeigt werden
  1333.  movem.l (sp)+,d1-d7/a0-a6
  1334.  move.l  d0,d7          ; aktueller Windowpointer nach d7
  1335.  bne.s   openok
  1336.  moveq   #0,d0          ; Bildschirm schwarz als Zeichen für verdächtige Disk
  1337.  bsr     optzeichen2    ; Notersatz für nicht zu öffnendes WarnWindow
  1338.  bra     openwindowerror
  1339. openok:
  1340.  move.l  d7,a0
  1341.  move.l  50(a0),a0      ; RastPort des Windows
  1342.  lea     NAME0(pc),a1   ; Name des Virus ausgeben
  1343.  moveq   #buff1-buff0+20,d0
  1344.  mulu    d6,d0
  1345.  add.l   d0,a1
  1346.  moveq   #38,d0         ; x-Wert
  1347.  moveq   #40,d1         ; y-Wert
  1348.  movem.l d0-d7/a0-a6,-(sp)
  1349.  jsr     -216(a6)       ; PrintIText
  1350.  movem.l (sp)+,d0-d7/a0-a6
  1351.  movem.l d0-d7/a0-a6,-(sp)
  1352.  btst    #31,d5         ; ein Bit aus 24-31 testen, z.B. 31
  1353.  beq.s   noonediff      ; wird durch GadgetID nicht überschrieben
  1354.  movem.l (sp)+,d0-d7/a0-a6
  1355.  moveq   #56,d1         ; y-Wert
  1356.  lea     ONEDIFF(pc),a1
  1357.  movem.l d0-d7/a0-a6,-(sp)
  1358.  jsr     -216(a6)       ; PrintIText
  1359. noonediff:
  1360.  move.l  $4.w,a6
  1361.  jsr     -138(a6)       ; Permit()
  1362.  movem.l (sp)+,d0-d7/a0-a6
  1363.  move.l  a6,-(sp)       ; intuitionbase retten
  1364.  move.l  $4.w,a6
  1365. waitmessage:
  1366.  move.l  d7,a0
  1367.  move.l  86(a0),a0      ; UserPort des Windows
  1368.  movem.l d1-d7/a0-a6,-(sp)
  1369.  jsr     -384(a6)       ; WaitPort(UserPort)
  1370.  movem.l (sp)+,d1-d7/a0-a6
  1371.  movem.l d1-d7/a0-a6,-(sp)
  1372.  jsr     -372(a6)       ; GetMsg(UserPort)
  1373.  movem.l (sp)+,d1-d7/a0-a6
  1374.  move.l  d0,a0
  1375.  move.l  d0,a1          ; für ReplyMsg nach a1
  1376.  move.l  20(a0),d4      ; Class = IDCMP-Flags nach d4
  1377.  cmp.l   #$200,d4
  1378.  beq.s   closegadget    ; da bei Systemgadgets Intuition-Objekt-Adresse nicht
  1379.  move.l  28(a0),a0      ; gesetzt wird, kann hier zufälliger Weise ungerade
  1380.  move.w  38(a0),d5      ; Adresse stehen, wodurch bei move.w TaskHeld
  1381. closegadget:            ; also nur bei User-Gadgets auswerten !
  1382.  movem.l d1-d7/a0-a6,-(sp)
  1383.  jsr     -378(a6)       ; ReplyMsg(a1=intuimessage), nachdem ausgewertet habe
  1384.  movem.l (sp)+,d1-d7/a0-a6
  1385.  cmp.w   #9,d5          ; Stringadget -> weiter warten
  1386.  beq.s   itis9          ; großes Gadget rechts dient nur der Information,
  1387.  cmp.w   #10,d5         ; deshalb weiter warten
  1388.  bne.s   portleeren
  1389. itis9:
  1390.  clr.w   d5             ; d5 löschen, damit wenn closegadget gedrückt, nicht
  1391.  bra.s   waitmessage    ; Endlosschleife, weil d5 ja noch erhalten !
  1392. portleeren:             ; sicherheitshalber nochmal Port abfragen bzw. leeren
  1393.  move.l  d7,a0          ; bevor Closewindow()
  1394.  move.l  86(a0),a0      ; UserPort des Windows
  1395.  movem.l d1-d7/a0-a6,-(sp)
  1396.  jsr     -372(a6)       ; GetMsg(UserPort)
  1397.  movem.l (sp)+,d1-d7/a0-a6
  1398.  tst.l   d0             ; sicherheitshalber Port leeren
  1399.  beq.s   leerende
  1400.  move.l  d0,a1
  1401.  movem.l d1-d7/a0-a6,-(sp)
  1402.  jsr     -378(a6)       ; ReplyMsg(a1=intuimessage)
  1403.  movem.l (sp)+,d1-d7/a0-a6
  1404.  bra.s   portleeren
  1405. leerende:
  1406.  move.l  (sp)+,a6
  1407.  move.l  d7,a0
  1408.  movem.l d1-d7/a0-a6,-(sp)
  1409.  jsr     -72(a6)        ; CloseWindow()
  1410.  movem.l (sp)+,d1-d7/a0-a6
  1411.  move.l  a6,a1
  1412.  move.l  $4.w,a6
  1413.  movem.l d1-d7/a0-a6,-(sp)
  1414.  jsr     -414(a6)       ; CloseLibrary("intuition.library")
  1415.  movem.l (sp)+,d1-d7/a0-a6
  1416.  
  1417.  cmp.l   #$200,d4       ; CloseWindow-Gadget gedrückt -> Ende
  1418.  bne.s   testgad0
  1419. openwindowerror:
  1420.  movem.l (sp)+,d1-d7/a0-a6
  1421.  bra     DOIOweiter
  1422.  
  1423. ; Endlosschleife, also immer wieder Warn-Window
  1424. ; öffnen, bis closewindow oder ende gedrückt
  1425. testgad0:
  1426.  tst.w   d5
  1427.  bne.s   testgad1          ; FarbSignal
  1428.  jsr     -132(a6)
  1429.  lea     colorflag(pc),a0
  1430.  not.b   (a0)
  1431.  lea     gadtext0text(pc),a1
  1432.  move.l  #"AUS ",14(a1)
  1433.  tst.b   (a0)
  1434.  beq.s   aus
  1435.  move.l  #" AN ",14(a1)
  1436. aus:
  1437.  jsr     -138(a6)
  1438.  bra     nopush
  1439. testgad1:                  ; Bootblock -> Schirm
  1440.  cmp.w   #1,d5
  1441.  bne.s   testgad2
  1442.  movem.l (sp)+,d1-d7/a0-a6 ; a1=IORequest
  1443.  lea     filename(pc),a4
  1444.  bra     showbootblock
  1445.  
  1446. testgad2:
  1447.  cmp.w   #2,d5
  1448.  bne.s   testgad3          ; Bootblock -> File
  1449.  move.l  a4,d0             ; a4 vor überschreiben durch movem retten
  1450.  movem.l (sp)+,d1-d7/a0-a6 ; a1=IORequest
  1451.  move.l  d0,a4
  1452.  bsr     namecorrect
  1453.  beq     openwindow
  1454.  bra     showbootblock
  1455.  
  1456. testgad3:
  1457.  cmp.w   #3,d5
  1458.  bne     testgad4          ; File -> Bootblock
  1459.  move.l  a4,d0             ; a4 vor überschreiben durch movem retten
  1460.  movem.l (sp)+,d1-d7/a0-a6 ; a1=IORequest
  1461.  move.l  d0,a4
  1462.  bsr     namecorrect
  1463.  beq     openwindow
  1464.  bsr     reallyoverwrite
  1465.  beq     openwindow
  1466.  movem.l d0-d7/a0-a6,-(sp)
  1467.  bsr     OpenDOS           ; OpenLibrary("dos.library",0);
  1468.  move.l  a4,d1             ; Filename-Adresse nach d1
  1469.  move.l  #1004,d2          ; MODE_READWRITE, da existierendes File lesen will,
  1470.  bsr     checkdevicename   ; sicherheitshalber kein MODE_OLDFILE, damit
  1471.  tst.l   d0                ; kein anderes Programm durch Schreiben stört
  1472.  beq.s   deviceunknown1
  1473.  movem.l d1-d7/a0-a6,-(sp)
  1474.  jsr     -30(a6)
  1475.  movem.l (sp)+,d1-d7/a0-a6
  1476.  tst.l   d0                ; Device schreibgeschützt
  1477.  bne.s   noErrorFile       ; -> Amiga-DOS-Autorequester
  1478. deviceunknown1:
  1479.  bsr     openerror         ; OpenError wegen z.B verbotenem Filenamen
  1480.  bra     OpenFailed        ; -> eigener Requester erforderlich
  1481. noErrorFile:
  1482.  move.l  d0,d1             ; filehandle für späteres read() und close() retten
  1483.  move.l  a5,d2             ; d2 = Puffer, in den die Bytes eingelesen werden
  1484.  move.l  #1024,d3          ; d3 = Anzahl der zu lesenden Bytes
  1485.  movem.l d0-d7/a0-a6,-(sp)
  1486.  jsr     -42(a6)           ; Read()  1024 Bytes aus File lesen
  1487.  movem.l (sp)+,d0-d7/a0-a6
  1488.  move.l  $4.w,a3
  1489.  exg     a3,a6
  1490.  bsr     bootblockwrite    ; und als Bootblock schreiben
  1491.  exg     a3,a6
  1492.  bra     CloseFileDOS
  1493.  
  1494. testgad4:
  1495.  cmp.w   #4,d5
  1496.  bne.s   testgad5          ; Standard-Bootblock
  1497.  movem.l (sp)+,d1-d7/a0-a6 ; a1=IORequest
  1498.  bsr     reallyoverwrite
  1499.  beq     openwindow
  1500.  bsr     bootblockclear    ; bootblock mit Null belegen
  1501.  lea     bootblock(pc),a0
  1502.  moveq   #bootblockend-bootblock-1,d0
  1503. loop7:
  1504.  move.b  (a0)+,(a2)+
  1505.  dbra    d0,loop7          ; StandardBootblock in Puffer kopieren
  1506.  bsr     bootblockwrite
  1507.  bra     openwindow
  1508.  
  1509. testgad5:
  1510.  cmp.w   #5,d5
  1511.  bne.s   testgad6          ; NoFastMem-Bootblock
  1512.  movem.l (sp)+,d1-d7/a0-a6 ; a1=IORequest
  1513.  bsr     reallyoverwrite
  1514.  beq     openwindow
  1515.  bsr     bootblockclear    ; bootblock mit Null belegen
  1516.  lea     nofastbootblock(pc),a0
  1517.  move.l  #nofastbootblockend-nofastbootblock-1,d0
  1518.  bra.s   loop7             ; NoFastMemBootblock schreiben
  1519.  
  1520. testgad6:
  1521.  cmp.w   #6,d5
  1522.  bne.s   testgad7          ; falsche Checksum -> Boot nicht möglich
  1523.  movem.l (sp)+,d1-d7/a0-a6 ; a1=IORequest
  1524.  bsr     Checksumfalsch
  1525.  bra     openwindow
  1526.  
  1527. testgad7:
  1528.  cmp.w   #7,d5
  1529.  bne.s   testgad8          ; richtige Checksum -> Boot möglich
  1530.  movem.l (sp)+,d1-d7/a0-a6 ; a1=IORequest
  1531.  bsr     Checksumrichtig
  1532.  bra     openwindow
  1533.  
  1534. testgad8:                  ; Beende Virus-Control
  1535.  cmp.w   #8,d5
  1536.  bne.s   testgad11         ; bei ID = 9,10 wird oben ja weiter gewartet
  1537.  movem.l (sp)+,d1-d7/a0-a6 ; a1=IORequest
  1538.  bsr     reallyexit        ; Sicherheitsabfrage
  1539.  beq     openwindow
  1540.  lea     exitflag(pc),a0
  1541.  move.b  #$ff,(a0)         ; exitflag für Vektor-Control-Task setzen
  1542.  bra     DOIOweiter
  1543.  
  1544. testgad11:
  1545.  cmp.w   #11,d5
  1546.  bne     testgad12         ; in NoWarning-File
  1547.  movem.l (sp)+,d1-d7/a0-a6 ; a1=IORequest
  1548.  movem.l d0-d7/a0-a6,-(sp)
  1549.  lea     freeposition(pc),a0
  1550.  clr.l   (a0)
  1551.  bsr     OpenDOS           ; OpenLibrary("dos.library",0);
  1552.  lea     NoWarning(pc),a0
  1553.  move.l  a0,d1             ; Filename-Adresse nach d1
  1554.  move.l  #1004,d2          ; MODE_READWRITE, um altes S:NoWarning-File
  1555.  bsr     checkdevicename   ; zu öffnen, EXCLUSIVE_LOCK nötig, da schreibend
  1556.  tst.l   d0                ; zugreife, denn wenn kein EXCLUSIVE-LOCK, könnte
  1557.  beq.s   unknowndevice2    ; ein anderer 'Laufwerk-Aufruf' ebenfalls gleich-
  1558.  movem.l d1-d7/a0-a6,-(sp) ; zeitig schreibend zugreifen -> falsche Daten
  1559.  jsr     -30(a6)
  1560.  movem.l (sp)+,d1-d7/a0-a6
  1561.  tst.l   d0
  1562.  bne.s   noErrorNoWarning
  1563.  move.l  #1006,d2          ; MODE_NEWFILE, um S:NoWarning-File neu anzulegen
  1564.  movem.l d1-d7/a0-a6,-(sp) ; -> EXCLUSIVE_LOCK
  1565.  jsr     -30(a6)
  1566.  movem.l (sp)+,d1-d7/a0-a6
  1567.  tst.l   d0
  1568.  bne.s   noErrorNoWarning  ; immer noch Error, z.B. weil S:NoWarning-File
  1569. unknowndevice2:
  1570.  bsr     openerror         ; bereits von anderem 'Laufwerk-Aufruf' EXKLUSIVE
  1571.  bra     OpenFailed        ; geöffnet wurde
  1572. noErrorNoWarning:
  1573.  move.l  d0,d1             ; filehandle
  1574. nextbootblock2:
  1575.  move.l  a5,a2
  1576.  lea     Nobuff(pc),a0
  1577.  move.l  a0,d2             ; Vektor-Kontroll-Task-Stackboden
  1578.  move.l  #1024,d3          ; als 1024-Puffer benutzen
  1579.  movem.l d1-d7/a0-a6,-(sp)
  1580.  jsr     -42(a6)           ; ersten Bootblock aus S:NoWarning lesen
  1581.  movem.l (sp)+,d1-d7/a0-a6
  1582.  cmp.l   #1024,d0          ; kein Bootblock mehr zu lesen -> Fileende
  1583.  bne     appendnext        ; File nach Eintrag durchsuchen, hierbei eventueller
  1584.  move.w  #$ff,d0           ; freier Block merken, wird mit Eintrag beschrieben
  1585. NoWarningloop2:            ; wenn kein Eintrag vorhanden war. wenn nichts frei
  1586.  cmp.l   #"FREE",(a0)      ; wird File verlängert. Wenn Eintrag vorhanden, wird
  1587.  bne.s   notfree           ; der Block lediglich als FREE markiert zurückge-
  1588.  bsr     getposition       ; schrieben wird, deshalb auch völlig egal wenn File
  1589. notfree:                   ; nicht ganz durchsuche.
  1590.  cmpm.l  (a0)+,(a2)+
  1591.  bne.s   nextbootblock2
  1592.  dbra    d0,NoWarningloop2
  1593.  bsr     alreadynoset      ; Bootblock bereits in S:NoWarning enthalten
  1594.  beq     CloseFileDOS      ; Bootblock in S:NoWarning belassen
  1595.  bsr     getposition       ; um jetzige Position zu erhalten, freeposition egal
  1596.  sub.l   #1024,d0          ; da ja nur FREE markiere
  1597.  move.l  d0,d2
  1598.  bsr     seekback1
  1599.  move.l  (a5),-(sp)        ; da für Weiterarbeit wiederherstellen muß
  1600.  move.l  #"FREE",(a5)
  1601.  move.l  a5,d2             ; d2 = bootblockpuffer
  1602.  move.l  #1024,d3          ; d3 = Anzahl der zu schreibenden Bytes
  1603.  movem.l d1-d7/a0-a6,-(sp)
  1604.  jsr     -48(a6)           ; Bootblock als FREE schreiben,
  1605.  movem.l (sp)+,d1-d7/a0-a6
  1606.  move.l  (sp)+,(a5)
  1607.  bra     CloseFileDOS
  1608.  
  1609. testgad12:                 ; in VirusName-File
  1610.  cmp.w   #12,d5
  1611.  bne     testgad13
  1612.  move.l  a4,d0             ; a4 vor überschreiben durch movem retten
  1613.  movem.l (sp)+,d1-d7/a0-a6 ; a1=IORequest
  1614.  move.l  d0,a4
  1615.  bsr     namecorrect
  1616.  beq     openwindow
  1617.  movem.l d0-d7/a0-a6,-(sp)
  1618.  lea     freeposition(pc),a0
  1619.  clr.l   (a0)
  1620.  bsr     OpenDOS           ; OpenLibrary("dos.library",0);
  1621.  lea     VirusName(pc),a0
  1622.  move.l  a0,d1             ; Filename-Adresse nach d1
  1623.  move.l  #1004,d2          ; MODE_READWRITE, um altes S:VirusName-File
  1624.  bsr     checkdevicename   ; zu öffnen, EXCLUSIVE_LOCK nötig, da schreibend
  1625.  tst.l   d0                ; zugreife, denn wenn kein EXCLUSIVE-LOCK, könnte
  1626.  beq.s   unknowndevice3    ; ein anderer 'Laufwerk-Aufruf' ebenfalls gleich-
  1627.  movem.l d1-d7/a0-a6,-(sp) ; zeitig schreibend zugreifen -> falsche Daten
  1628.  jsr     -30(a6)
  1629.  movem.l (sp)+,d1-d7/a0-a6
  1630.  tst.l   d0
  1631.  bne.s   noErrorVirusName
  1632.  move.l  #1006,d2          ; MODE_NEWFILE, um S:VirusName-File neu anzulegen
  1633.  movem.l d1-d7/a0-a6,-(sp) ; -> EXCLUSIVE_LOCK
  1634.  jsr     -30(a6)
  1635.  movem.l (sp)+,d1-d7/a0-a6
  1636.  tst.l   d0
  1637.  bne.s   noErrorVirusName  ; immer noch Error, z.B. weil S:VirusName-File
  1638. unknowndevice3:
  1639.  bsr     openerror         ; bereits von anderem 'Laufwerk-Aufruf' EXKLUSIVE
  1640.  bra     OpenFailed        ; geöffnet wurde
  1641. noErrorVirusName:
  1642.  move.l  d0,d1             ; filehandle
  1643. nextbootblock3:
  1644.  lea     onediff1(pc),a0
  1645.  clr.b   (a0)
  1646.  lea     Vibuff(pc),a0
  1647.  move.l  a0,d2                ; Vektor-Kontroll-Task-Stackboden
  1648.  move.l  #1024+buff1-buff0,d3 ; als 1024+32-Puffer benutzen
  1649.  movem.l d1-d7/a0-a6,-(sp)
  1650.  jsr     -42(a6)             ; ersten Virusname+Bootblock aus S:VirusName lesen
  1651.  movem.l (sp)+,d1-d7/a0-a6
  1652.  cmp.l   #1024+buff1-buff0,d0
  1653.  bne.s   fileende2
  1654.  lea     oldname(pc),a2
  1655.  bsr     copyname
  1656.  move.w  #$ff,d0
  1657.  move.l  a5,a2
  1658. VirusNameloop1:
  1659.  cmp.l   #"FREE",(a0)
  1660.  bne.s   notfree1
  1661.  bsr     getposition       ; während ich notfalls ganzes File nach Eintrag
  1662. notfree1:                  ; absuche, freeposition schon mal merken
  1663.  cmpm.l  (a0)+,(a2)+
  1664.  beq.s   issame1
  1665.  movem.l a0/a1,-(sp)
  1666.  lea     onediff1(pc),a0
  1667.  tst.b   (a0)
  1668.  movem.l (sp)+,a0/a1
  1669.  bne.s   nextbootblock3
  1670. countit1:
  1671.  movem.l a0/a1,-(sp)
  1672.  lea     onediff1(pc),a0   ; 1 Longword-Unterschied erfassen
  1673.  move.b  #$ff,(a0)         ; Flag für 1 Longword-Unterschied
  1674.  movem.l (sp)+,a0/a1
  1675. issame1:
  1676.  dbra    d0,VirusNameloop1
  1677.  bsr     alreadyviset      ; gefunden !
  1678.  beq     CloseFileDOS
  1679.  bsr     getposition
  1680.  sub.l   #1024+buff1-buff0,d0 ; minus 1 Eintrag
  1681.  move.l  d0,d2
  1682.  bsr     seekback1
  1683.  move.l  a4,a0
  1684.  lea     nameoverwrite(pc),a2
  1685.  bsr     copyname
  1686.  bsr     alreadyviwork
  1687.  beq.s   nixfrei3          ; mit neuem Namen überschreiben
  1688.  move.l  #"FREE",(a5)
  1689.  bra.s   nixfrei3          ; als FREE markieren
  1690. fileende2:                 ; nicht gefunden !
  1691.  move.l  freeposition(pc),d2
  1692.  beq.s   nixfrei3          ; wenn freier Eintrag, dann diesen setzen
  1693.  sub.l   #1024+buff1-buff0,d2
  1694.  bsr     seekback1
  1695. nixfrei3:
  1696.  move.l  a4,d2             ; 32-Byte-VirusName
  1697.  moveq   #buff1-buff0,d3
  1698.  movem.l d1-d7/a0-a6,-(sp)
  1699.  jsr     -48(a6)           ; VirusName an S:VirusName hängen
  1700.  movem.l (sp)+,d1-d7/a0-a6
  1701.  bra.s   nixfrei
  1702. appendnext:
  1703.  move.l  freeposition(pc),d2
  1704.  beq.s   nixfrei
  1705.  sub.l   #1024,d2          ; wenn freier Eintrag, dann diesen setzen
  1706.  bsr     seekback1
  1707. nixfrei:
  1708.  move.l  a5,d2             ; d2 = bootblockpuffer
  1709.  move.l  #1024,d3          ; d3 = Anzahl der zu schreibenden Bytes
  1710.  movem.l d1-d7/a0-a6,-(sp)
  1711.  jsr     -48(a6)           ; bootblock an File hängen
  1712.  movem.l (sp)+,d1-d7/a0-a6 ; Stackebene wird erst in CloseFileDos restauriert
  1713.  move.l  $4.w,a3           ; dennoch bootblockread, da a1=IORequest unverändert
  1714.  exg     a3,a6             ; bootblockread verändert d1=filehandle nicht
  1715.  bsr     bootblockread     ; FREE-Markirung überschreiben, damit korrekt
  1716.  exg     a3,a6             ; weiterarbeiten kann, hier immer CMD_READ
  1717.  bra     CloseFileDOS
  1718.  
  1719. testgad13:                 ; deletevirus
  1720.  cmp.w   #13,d5
  1721.  bne.s   testgad14
  1722.  lea     gadtext13(pc),a1  ; in Autorequester wegen Farben 'unsichtbar',
  1723.  bsr     kill              ; in a6 steht exec.base
  1724.  bra     nopush
  1725.  
  1726. testgad14:                 ; File - Schutz
  1727.  cmp.w   #14,d5
  1728.  bne     testgad15
  1729.  move.l  a4,d0
  1730.  movem.l (sp)+,d1-d7/a0-a6 ; a1=IORequest
  1731.  move.l  d0,a4
  1732.  moveq   #0,d4             ; Flag für check directory (noloadfi:) löschen
  1733.  movem.l d0-d7/a0-a6,-(sp)
  1734.  bsr     OpenDOS           ; OpenLibrary("dos.library",0);
  1735.  move.l  a4,d1             ; Filename-Adresse nach d1
  1736.  move.l  #1004,d2          ; MODE_READWRITE, da existierendes File lesen will,
  1737.  bsr     checkdevicename   ; sicherheitshalber kein MODE_OLDFILE, damit
  1738.  tst.l   d0                ; kein anderes Programm durch Schreiben stört
  1739.  beq     nodirectory
  1740.  movem.l d1-d7/a0-a6,-(sp)
  1741.  jsr     -30(a6)
  1742.  movem.l (sp)+,d1-d7/a0-a6
  1743.  tst.l   d0
  1744.  bne     noErrorFile1
  1745.  move.l  a4,d1             ; Directory eingetragen ?
  1746.  moveq   #-2,d2            ; ACCESS_READ
  1747.  movem.l d1-d7/a0-a6,-(sp)
  1748.  jsr     -84(a6)           ; Lock()
  1749.  movem.l (sp)+,d1-d7/a0-a6
  1750.  tst.l   d0
  1751.  beq     nodirectory       ; auch kein Directory eingetragen
  1752.  move.l  d0,-(sp)          ; für Unlock()     RETTEN
  1753.  move.l  d0,d1
  1754.  movem.l d1-d7/a0-a6,-(sp)
  1755.  jsr     -126(a6)          ; cd auf eingetragenes directory
  1756.  movem.l (sp)+,d1-d7/a0-a6
  1757.  move.l  d0,-(sp)          ; für restaurieren RETTEN
  1758.  movem.l d1-d7/a0-a6,-(sp)
  1759.  move.l  #260,d0           ; Speicher für struct FileInfoBlock belegen
  1760.  moveq   #1,d1
  1761.  move.l  $4.w,a6           ; entsprechend Speicher anfordern
  1762.  jsr     -198(a6)
  1763.  movem.l (sp)+,d1-d7/a0-a6
  1764.  move.l  d0,d2
  1765.  beq.s   mmm
  1766.  move.l  d0,-(sp)          ; Speicheradresse  RETTEN
  1767.  move.l  8(sp),d1
  1768.  movem.l d1-d7/a0-a6,-(sp)
  1769.  jsr     -102(a6)          ; Examine()
  1770.  movem.l (sp)+,d1-d7/a0-a6
  1771.  moveq   #-1,d4            ; Flag für check directory (noloadfi:)
  1772. exnext:
  1773.  move.l  8(sp),d1          ; Lock
  1774.  move.l  (sp),d2           ; Speicher für FileInfoBlock
  1775.  movem.l d1-d7/a0-a6,-(sp)
  1776.  jsr     -108(a6)          ; ExNext()
  1777.  movem.l (sp)+,d1-d7/a0-a6
  1778.  tst.l   d0                ; d0=0 wenn keine Files mehr vorhanden
  1779.  beq.s   kkk
  1780.  move.l  d2,a0
  1781.  lea     8(a0),a4
  1782.  move.l  a4,d1             ; Filename-Adresse nach d1
  1783.  move.l  #1004,d2          ; MODE_READWRITE, da existierendes File lesen will,
  1784.  movem.l d1-d7/a0-a6,-(sp) ; sicherheitshalber kein MODE_OLDFILE, damit
  1785.  jsr     -30(a6)           ; kein anderes Programm durch Schreiben stört
  1786.  movem.l (sp)+,d1-d7/a0-a6
  1787.  tst.l   d0
  1788.  bne.s   noErrorFile1
  1789.  bra.s   exnext            ; wenn Directory
  1790. kkk:
  1791.  move.l  a1,a0             ; IORequest retten
  1792.  move.l  (sp)+,a1
  1793.  move.l  #260,d0
  1794.  movem.l d1-d7/a0-a6,-(sp)
  1795.  move.l  $4.w,a6
  1796.  jsr     -210(a6)          ; FreeMem
  1797.  movem.l (sp)+,d1-d7/a0-a6
  1798.  move.l  a0,a1
  1799. mmm:
  1800.  move.l  (sp)+,d1
  1801.  movem.l d1-d7/a0-a6,-(sp)
  1802.  jsr     -126(a6)          ; cd wiederherstellen
  1803.  movem.l (sp)+,d1-d7/a0-a6
  1804.  move.l  (sp)+,d1
  1805.  movem.l d1-d7/a0-a6,-(sp)
  1806.  jsr     -90(a6)           ; Unlock()
  1807.  movem.l (sp)+,d1-d7/a0-a6
  1808.  move.l  $4.w,a3           ; Stackebene wird erst in CloseFileDos restauriert
  1809.  exg     a3,a6             ; dennoch bootblockread, da a1=IORequest unverändert
  1810.  bsr     bootblockread     ; bootblockread verändert d1=filehandle nicht
  1811.  exg     a3,a6             ; Bootblockpuffer wiederherstellen
  1812.  bra     Openfailed
  1813. nodirectory:
  1814.  bsr     openerror         ; OpenError wegen z.B verbotenem Filenamen
  1815.  bra     OpenFailed        ; -> eigener Requester erforderlich
  1816. noErrorFile1:
  1817.  move.l  d0,d1             ; filehandle für späteres read() und close() retten
  1818. nextbootblock4:
  1819.  move.l  a5,a0             ; mit 0 vorbelegen, damit nicht zufällig Kennung in
  1820.  bsr     clear1024         ; Puffer steht, wenn nur < 1024 aus File lesen kann
  1821.  bsr     testfile          ; erste 1024 Bytes aus File in Bootblockpuffer lesen
  1822.  cmp.l   #$000003f3,(a5)
  1823.  beq.s   isloadfile
  1824.  bsr     noloadfile
  1825.  bra     noloadfi
  1826. isloadfile:
  1827.  move.w  #$ff,d0
  1828.  move.l  a5,a2             ; d0 und a2 als Zähler
  1829. piusloop:
  1830.  cmp.l   #$000003e8,(a2)+
  1831.  bne.s   cvb
  1832.  subq.l  #1,d0
  1833.  bpl.s   yyx
  1834.  bsr     testfile          ; nächste 1024 Bytes lesen
  1835.  tst.l   d0                ; Fileende ?
  1836.  beq.s   bbn
  1837.  move.w  #$ff,d0
  1838.  move.l  a5,a2             ; d0 und a2 als Zähler
  1839. yyx:
  1840.  cmp.l   #$00000002,(a2)+
  1841.  bne.s   cvb
  1842.  subq.l  #1,d0
  1843.  bpl.s   yyy
  1844.  bsr     testfile          ; nächste 1024 Bytes lesen
  1845.  tst.l   d0                ; Fileende ?
  1846.  beq.s   bbn
  1847.  move.w  #$ff,d0
  1848.  move.l  a5,a2             ; d0 und a2 als Zähler
  1849. yyy:
  1850.  cmp.l   #"PIUS",(a2)+
  1851.  beq.s   marked
  1852. cvb:
  1853.  dbra    d0,piusloop
  1854.  bsr     testfile          ; nächste 1024 Bytes lesen
  1855.  tst.l   d0                ; Fileende ?
  1856.  bne.s   isloadfile
  1857. bbn:
  1858.  bsr     schuetzenodweiter
  1859.  beq     noloadfi
  1860.  bsr     setend            ; Filelänge holen
  1861.  lea     Kennung(pc),a0
  1862.  move.l  d0,Kennzahl-Kennung(a0)
  1863.  move.l  a0,d2
  1864.  moveq   #20,d3
  1865.  movem.l d0-d7/a0-a6,-(sp)
  1866.  jsr     -48(a6)           ; an das File die Kennung anhängen
  1867.  movem.l (sp)+,d0-d7/a0-a6
  1868.  bra     noloadfi
  1869. marked:
  1870.  tst.l   d0                ; muß nächster 1024-Block gelesen werden ?,
  1871.  bne.s   notblockend       ; da ich ja ursprüngliche Filelänge brauche
  1872.  bsr     testfile
  1873.  move.l  a5,a2
  1874. notblockend:
  1875.  bsr     setend            ; setend gibt in d0 aktuelle Filelänge zurück
  1876.  sub.l   #20,d0            ; Kennung von Filelänge abziehen
  1877.  move.l  d0,d7             ; Filelänge retten
  1878.  cmp.l   (a2),d0           ; d0=aktuelle Filelänge  a2=ursprüngliche Filelänge
  1879.  beq.s   fileokay
  1880.  bsr     filedanger
  1881.  bra     noloadfi
  1882. fileokay:
  1883.  bsr     FileIsOkay
  1884. noloadfi:
  1885.  tst.l   d4
  1886.  beq.s   onlyfile
  1887.  movem.l d1-d7/a0-a6,-(sp)
  1888.  jsr     -36(a6)           ; Close() file
  1889.  movem.l (sp)+,d1-d7/a0-a6
  1890.  bra     exnext
  1891. onlyfile:
  1892.  move.l  $4.w,a3           ; Stackebene wird erst in CloseFileDos restauriert
  1893.  exg     a3,a6             ; dennoch bootblockread, da a1=IORequest unverändert
  1894.  bsr     bootblockread     ; bootblockread verändert d1=filehandle nicht
  1895.  exg     a3,a6             ; Bootblockpuffer wiederherstellen
  1896.  bra     CloseFileDOS      ; da ja durch Filebytes überschrieben wurde
  1897.  
  1898. testgad15:                 ; CheckOpen
  1899.  cmp.w   #15,d5
  1900.  bne.s   testgad16
  1901.  jsr     -132(a6)
  1902.  lea     openflag(pc),a0
  1903.  not.b   (a0)
  1904.  lea     gadtext15text(pc),a1
  1905.  move.l  #"AUS ",14(a1)
  1906.  tst.b   (a0)
  1907.  bne.s   aus1
  1908.  move.l  #" AN ",14(a1)
  1909. aus1:
  1910.  jsr     -138(a6)
  1911.  bra     nopush
  1912.  
  1913. testgad16:                 ; Files durchsuchen
  1914. ; cmp.w   #16,d5
  1915. ; bne.s   testgad17
  1916.  jsr     -132(a6)
  1917.  lea     searchfiles(pc),a0
  1918.  not.b   (a0)
  1919.  lea     gadtext16text(pc),a1
  1920.  move.l  #"AUS ",14(a1)
  1921.  tst.b   (a0)
  1922.  beq.s   aus2
  1923.  move.l  #" AN ",14(a1)
  1924. aus2:
  1925.  jsr     -138(a6)
  1926.  bra     nopush
  1927.  
  1928. ; testgad17:
  1929.  
  1930. namecorrect:
  1931.  movem.l a0-a3,-(sp)
  1932.  jsr     -132(a6)
  1933.  move.l  a4,a0
  1934.  lea     correctname(pc),a2; den aktuellen Stringadget-Puffer-Inhalt
  1935.  bsr     copyname          ; in Intuitext-Struktur kopieren
  1936.  bsr     modifyunit        ; und anzeigen, ob okay
  1937.  lea     CORRECT(pc) ,a1
  1938.  bra.s   shorter1
  1939.  
  1940. reallyexit:
  1941.  movem.l a0-a3,-(sp)       ; Sicherheitsabfrage, ob VirusControl wirklich
  1942.  jsr     -132(a6)          ; verlassen werden soll
  1943.  lea     EXIT(pc) ,a1
  1944.  bra.s   shorter1
  1945.  
  1946. writebbzugriff:
  1947.  movem.l a0-a3,-(sp)       ; Schreibzugriff auf Bootblock in Lesen wandeln ?
  1948.  jsr     -132(a6)
  1949.  bsr     modifyunit
  1950.  lea     WRITEBB(pc) ,a1
  1951.  bra.s   shorter1
  1952.  
  1953. reallyoverwrite:
  1954.  movem.l a0-a3,-(sp)       ; Sicherheitsabfrage, ob Bootblock wirklich
  1955.  jsr     -132(a6)          ; überschrieben werden soll
  1956.  bsr     modifyunit
  1957.  lea     OVERWRITE(pc) ,a1
  1958. shorter1:
  1959.  lea     OVERWRITEL(pc),a2
  1960.  lea     OVERWRITER(pc),a3
  1961. shorter2:
  1962.  bsr     autorequest
  1963.  jsr     -138(a6)
  1964.  movem.l (sp)+,a0-a3
  1965.  tst.l   d0                ; rts verändert keine Flags
  1966.  rts
  1967.  
  1968. fileprotect:
  1969.  movem.l a0-a3,-(sp)
  1970.  jsr     -132(a6)
  1971.  move.l  a4,a0
  1972.  lea     checkfilename(pc),a2
  1973.  bsr     copyname
  1974.  lea     FILESCHUTZ(pc),a1
  1975.  bra.s   shorter1
  1976.  
  1977. openerror:                 ; zeigt Open-Error an
  1978.  movem.l a0-a6,-(sp)       ; da in a6 dosbase steht
  1979.  move.l  $4.w,a6           ; aber autorequest in a6 exec.base erwartet
  1980.  jsr     -132(a6)
  1981.  bsr     modifyunit
  1982.  lea     OPENERR(pc),a1
  1983. shorter7:
  1984.  lea     NOBOOTR(pc),a2
  1985. shorter5:
  1986.  lea     NOBOOTR(pc),a3
  1987. shorter6:
  1988.  bsr     autorequest
  1989.  jsr     -138(a6)
  1990.  movem.l (sp)+,a0-a6
  1991.  tst.l   d0
  1992.  rts
  1993.  
  1994. alreadynoset:              ; Requester, welcher erscheint, wenn Bootblock
  1995.  movem.l a0-a6,-(sp)       ; bereits in S:NoWarning vorhanden ist.
  1996.  move.l  $4.w,a6
  1997.  jsr     -132(a6)
  1998.  bsr     modifyunit
  1999.  lea     ALREADYNO(pc),a1
  2000.  lea     ALREADYNOdel(pc),a2
  2001.  bra.s   shorter5
  2002.  
  2003. alreadyviset:              ; Requester, welcher erscheint, wenn Bootblock
  2004.  movem.l a0-a6,-(sp)       ; bereits in S:VirusName vorhanden ist.
  2005.  move.l  $4.w,a6
  2006.  jsr     -132(a6)
  2007.  bsr     modifyunit
  2008.  lea     ALREADYVI(pc),a1
  2009.  lea     ALREADYWORK(pc),a2
  2010.  bra.s   shorter5
  2011.  
  2012. alreadyviwork:             ; Requester, welcher folgendes anbietet
  2013.  movem.l a0-a6,-(sp)       ; Bootblock+Name aus S:VirusName entfernen oder
  2014.  move.l  $4.w,a6           ; alten Namen durch neuen Namen ersetzen
  2015.  jsr     -132(a6)
  2016.  bsr     modifyunit
  2017.  lea     ALREADYVI(pc),a1
  2018.  lea     ALREADYNOdel(pc),a2
  2019.  lea     ALREADYNOnam(pc),a3
  2020.  bra.s   shorter6
  2021.  
  2022. noloadfile:
  2023.  movem.l a0-a6,-(sp)       ; da in a6 dosbase steht
  2024.  move.l  $4.w,a6           ; aber forbid und autorequest exec.base erwartet
  2025.  jsr     -132(a6)
  2026.  move.l  a4,a0
  2027.  lea     keinloadfile(pc),a2
  2028.  bsr     copyname
  2029.  lea     noloadf(pc),a1
  2030.  bra     shorter7
  2031.  
  2032. filedanger:
  2033.  movem.l a0-a6,-(sp)       ; da in a6 dosbase steht
  2034.  move.l  $4.w,a6           ; aber forbid und autorequest exec.base erwartet
  2035.  jsr     -132(a6)
  2036.  move.l  a4,a0
  2037.  lea     linkname(pc),a2
  2038.  bsr     copyname
  2039.  lea     link(pc),a1
  2040.  bra     shorter7
  2041.  
  2042. FileIsOkay:
  2043.  movem.l a0-a6,-(sp)       ; da in a6 dosbase steht
  2044.  move.l  $4.w,a6           ; aber forbid und autorequest exec.base erwartet
  2045.  jsr     -132(a6)
  2046.  move.l  a4,a0
  2047.  lea     checkfilename(pc),a2
  2048.  bsr     copyname
  2049.  lea     FILESCHUTZ(pc),a1
  2050.  lea     okk(pc),a2
  2051.  lea     okk(pc),a3
  2052.  bra     shorter6
  2053.  
  2054. schuetzenodweiter:
  2055.  movem.l a0-a6,-(sp)       ; da in a6 dosbase steht
  2056.  move.l  $4.w,a6           ; aber forbid und autorequest exec.base erwartet
  2057.  jsr     -132(a6)
  2058.  move.l  a4,a0
  2059.  lea     checkfilename(pc),a2
  2060.  bsr     copyname
  2061.  lea     FILESCHUTZ(pc),a1
  2062.  lea     neusch(pc),a2
  2063.  bra     shorter5
  2064.  
  2065. allowaccess:
  2066.  movem.l a0-a3,-(sp)   ; Zugriff auf File erlauben ?
  2067.  move.l  $4.w,a6
  2068.  jsr     -132(a6)
  2069.  move.l  d1,a0
  2070.  lea     filewrite(pc),a2
  2071.  bsr     copyname
  2072.  lea     OPENFILEnam(pc) ,a1
  2073.  bra     shorter1
  2074.  
  2075. getposition:
  2076.  moveq   #0,d2
  2077.  moveq   #0,d3
  2078.  movem.l d1-d7/a0-a6,-(sp)
  2079.  jsr     -66(a6)           ; Seek() -> aktuelle Fileposition holen
  2080.  lea     freeposition(pc),a0
  2081.  move.l  d0,(a0)           ; position merken
  2082.  movem.l (sp)+,d1-d7/a0-a6
  2083.  rts
  2084.  
  2085. seekback1:
  2086.  moveq   #-1,d3
  2087. seekit:
  2088.  movem.l d1-d7/a0-a6,-(sp)
  2089.  jsr     -66(a6)
  2090.  movem.l (sp)+,d1-d7/a0-a6
  2091.  rts
  2092.  
  2093. addtask:
  2094.  ; mittels addtask task einbinden, welcher die Systemvektoren 1* pro Sekunde
  2095.  ; überprüft, in coolroutine kann man addtask noch nicht aufrufen->Absturz
  2096.  ; in coolroutine sind nur einige exec-routinen aufrufbar.
  2097.  movem.l d0-d7/a0-a6,-(sp); alle Register retten
  2098.  lea     structtask(pc),a1
  2099.  lea     task(pc),a2
  2100.  sub.l   a3,a3  ; 2 Bytes statt  6 Bytes(move.l #0,a3)
  2101.  jsr     -282(a6)       ; addtask
  2102.  movem.l (sp)+,d0-d7/a0-a6
  2103.  rts
  2104.  
  2105. deletevirus:
  2106.  bsr     optzeichen
  2107.  clr.l   546(a6)           ; KickMemPtr löschen
  2108.  clr.l   550(a6)           ; KickTagPtr löschen
  2109.  clr.l   554(a6)           ; KickCheckSum löschen
  2110.  clr.l   42(a6)            ; COLD-Vektor löschen
  2111.  move.l  58(a6),a0         ; 1024 Bytes am Supervisorstackboden löschen,
  2112.  bsr.s   clear1024         ; da sich dort oft Viren einnisten
  2113.  move.l  BeginIOAdr(pc),a0 ; Original-BeginIO-Vektor setzen
  2114.  move.l  restoreIO(pc),(a0); und zwar ROM-version-unabhängig
  2115. VCrestore:
  2116.  lea     lastBeginIO(pc),a0; letzten BeginIO-Wert löschen
  2117.  clr.l   (a0)
  2118.  lea     lastKickMem(pc),a0
  2119.  clr.l   (a0)+             ; lastKickMem löschen
  2120.  clr.l   (a0)+             ; lastKickTag löschen
  2121.  clr.l   (a0)              ; lastKickCheck löschen
  2122.  lea     newDOIO(pc),a0    ; muß DOIO bei jedem reset wieder neu auf newDOIO
  2123.  move.l  a0,-454(a6)       ; verbiegen, da auf Originalwert zurückgesetzt wurde
  2124.  move.l  a0,-(sp)
  2125.  lea     lastDOIO(pc),a0   ; VIRUS-CONTROL-DOIO-Wert als lastDOIO setzen
  2126.  move.l  (sp)+,(a0)
  2127. execchecksum:
  2128.  lea     lastCOOL(pc),a0
  2129.  move.l  pointer(pc),(a0)   ; VIRUS-CONTROL-COOL-Wert als lastCOOL setzen
  2130.  move.l  pointer(pc),$2e(a6); Cool-Vektor auf VIRUS-CONTROL verbiegen
  2131.  lea     $22(a6),a0         ; Execchecksumme neu berechnen
  2132.  clr.w   d0                 ; Cool-Vektor und Execchecksum bleibt bei
  2133.  moveq   #$17,d1            ; Reset erhalten
  2134. execcheck:
  2135.  add.w   (a0)+,d0
  2136.  dbra    d1,execcheck
  2137.  not.w   d0
  2138.  move.w  d0,(a0)
  2139.  rts
  2140.  
  2141. clear1024:
  2142.  move.w   #$00ff,d0     ; dbra arbeitet nur mit Word-breite
  2143. clearloop:              ; Einsprung mit d0=$007f löscht 128 * 4 = 512 Bytes
  2144.  clr.l   (a0)+
  2145.  dbra    d0,clearloop   ; 256 * 4 = 1024 Bytes löschen
  2146.  rts
  2147.  
  2148. Bootblockclear:
  2149.  move.l  a5,a0
  2150.  move.l  a0,a2
  2151.  bra.s   clear1024
  2152.  
  2153. nameunknown:
  2154.  movem.l d0-d7/a0-a6,-(sp)
  2155.  lea     NAME0text(pc),a2
  2156.  moveq   #buff1-buff0+20,d0
  2157.  mulu    d6,d0
  2158.  add.l   d0,a2          ; Virusname mit unbekannt überschreiben
  2159.  lea     unknown(pc),a0
  2160.  bsr.s   copyname
  2161.  movem.l (sp)+,d0-d7/a0-a6
  2162.  rts
  2163.  
  2164. copyname:
  2165.  moveq   #buff1-buff0-1,d0
  2166. copyvirusname:
  2167.  move.b  (a0)+,(a2)+
  2168.  dbra    d0,copyvirusname
  2169.  rts
  2170.  
  2171. checkdevicename:           ; df0:-trackdisk.device-task oft task-held, wenn
  2172.  movem.l d1-d7/a0-a6,-(sp) ; versucht wird, nicht vorhandenes Device zu öffnen
  2173.  move.l  d1,a4             ; bei df1: df2: df3:-trackdisk.device-task kein
  2174.  move.l  d1,a0             ; task-held, sondern es erscheint Systemrequester
  2175.  move.l  $4.w,a3           ; warum stürzt nur df0: ab ???
  2176.  exg     a3,a6             ; Um df0:-task-held zu verhindern, vorher prüfen,
  2177.  jsr     -132(a6)          ; ob Devicename angegeben ist, und wenn ja, ob das
  2178.  exg     a3,a6             ; angegebene Device vorhanden ist
  2179.  moveq   #-1,d0
  2180. isitdevice:
  2181.  tst.b   (a0)              ; Filename
  2182.  beq.s   searchend         ; ende mit d0=$ffffffff, wenn kein Device angegeben
  2183.  cmp.b   #":",(a0)+
  2184.  bne.s   isitdevice
  2185.  move.l  34(a6),a0         ; RootNode
  2186.  move.l  24(a0),d0         ; DosInfo
  2187.  lsl.l   #2,d0             ; BPTR * 4 = APTR
  2188.  move.l  d0,a0
  2189.  move.l  4(a0),d0          ; DevInfo
  2190. nextdevice:
  2191.  move.l  a4,a3             ; a3 mit Filename-Adresse laden
  2192.  lsl.l   #2,d0             ; BPTR * 4 = APTR
  2193.  move.l  d0,a0
  2194.  move.l  40(a0),d0         ; DeviceName
  2195.  lsl.l   #2,d0             ; BPTR * 4 = APTR
  2196.  move.l  d0,a2
  2197.  move.b  (a2)+,d1          ; erstes Byte = Stringlänge (BSTR)
  2198.  ext.w   d1                ; wegen dbra auf wordbreite bringen
  2199.  subq.w  #1,d1             ; da dbra bis -1 zählt
  2200. testdevice:
  2201.  cmpm.b  (a2)+,(a3)+
  2202.  bne.s   testgrossklein
  2203. teston:
  2204.  dbra    d1,testdevice
  2205.  cmp.b   #":",(a3)
  2206.  beq.s   isdevice
  2207.  moveq   #0,d0
  2208.  bra.s   searchend         ; z.B. RAMM: statt RAM: eingegeben
  2209. isdevice:
  2210.  moveq   #-1,d0            ; Device existiert -> d0 = $ffffffff
  2211.  bra.s   searchend
  2212. testgrossklein:            ; da AmigaDOS Groß/Klein nicht unterscheidet,
  2213.  add.b   #32,-(a3)         ; muß ich ebenso verfahren
  2214.  subq.l  #1,a2
  2215.  cmpm.b  (a2)+,(a3)+       ; klappt der Vergleich als Groß-Buchstabe ?
  2216.  beq.s   teston
  2217.  sub.b   #64,-(a3)
  2218.  subq.l  #1,a2
  2219.  cmpm.b  (a2)+,(a3)+       ; klappt der Vergleich als Klein-Buchstabe ?
  2220.  beq.s   teston
  2221.  add.b   #32,-(a3)         ; wieder Original-Wert restaurieren
  2222.  move.l  (a0),d0           ; wenn kein Device mehr -> d0 = 0
  2223.  bne.s   nextdevice        ; NextDevice
  2224. searchend:
  2225.  move.l  $4.w,a6
  2226.  jsr     -138(a6)          ; okay wenn d0=$ffffffff, der Fall, wenn kein Device
  2227.  movem.l (sp)+,d1-d7/a0-a6 ; angegeben oder wenn angegebenes  Device existiert.
  2228.  rts                       ; d0=0, wenn ein angegebenes Device nicht existiert
  2229.  
  2230. OpenIntuition:             ; OpenLibrary("intuition.library",0);
  2231.  movem.l d1-d7/a0-a6,-(sp) ; verändert d0,a6
  2232.  lea     intuition(pc),a1
  2233.  bra.s   shorter3
  2234.  
  2235. OpenDOS:                   ; OpenLibrary("dos.library",0);
  2236.  movem.l d1-d7/a0-a6,-(sp) ; verändert d0,a6
  2237.  lea     dosname(pc),a1
  2238. shorter3:
  2239.  moveq   #0,d0             ; Version >= 0
  2240.  jsr     -552(a6)          ; OpenLibrary("intuition.library",0)
  2241.  movem.l (sp)+,d1-d7/a0-a6
  2242.  move.l  d0,a6             ; base nach a6
  2243.  rts                       ; da in ROM, testen praktisch überflüssig
  2244.  
  2245. CloseFile:
  2246.  jsr     -36(a6)           ; Close() file
  2247. CloseDOS:
  2248.  move.l  a6,a1
  2249.  move.l  $4.w,a6
  2250.  jmp     -414(a6)          ; CloseLibrary("dos.library",0) + rts
  2251.  
  2252. clearflags:
  2253.  lea     exitcount(pc),a0
  2254.  subq.b  #1,(a0)           ; exitcount -1 wenn Arbeit mit Diskette beendet ist
  2255.  lea     inuse0(pc),a0
  2256.  add.l   d6,a0
  2257.  clr.b   (a0)              ; inuse-Flag des Laufwerks löschen
  2258.  rts
  2259.  
  2260. settimer:
  2261.  sub.l   a1,a1
  2262.  jsr     -294(a6)
  2263.  lea     timeport(pc),a1
  2264.  move.l  d0,16(a1)
  2265.  jsr     -354(a6)
  2266.  lea     timerdev(pc),a0
  2267.  lea     timereq(pc),a1    ; Task schickt Message(=request) an den task des
  2268.  moveq   #1,d0             ; timer.devices, wenn Zeit um, schickt der task des
  2269.  moveq   #0,d1             ; timer.devices Message an den Port meines Tasks,
  2270.  jsr     -444(a6)          ; da ja meine Port-Adresse in request eingetragen.
  2271.  lea     timeport(pc),a3   ; Das Eintreffen der Message am Port erkennt mein
  2272.  lea     timereq(pc),a1    ; Task, da in dem Port meine Task-Adresse als der
  2273.  move.l  a3,14(a1)         ; zu benachrichtigende Task steht
  2274.  rts
  2275.  
  2276. freemem:
  2277.  move.l  #end-reset+9000,d0 ; Bytesize
  2278.  move.l  pointer(pc),a1
  2279.  jmp     -210(a6)           ; FreeMem + rts
  2280.  
  2281. remreqport:
  2282.  lea     timereq(pc),a1
  2283.  jsr     -450(a6)          ; CloseDevice()
  2284.  lea     timeport(pc),a1
  2285.  jmp     -360(a6)          ; RemPort()
  2286.  
  2287. restoreopen:
  2288.  lea     jmpoldopen(pc),a0
  2289.  move.l  dosbase(pc),a4
  2290.  cmp.w   #$4ef9,-30(a4)
  2291.  bne.s   notchanged
  2292.  jsr     -120(a6)          ; Disable(), da theoretisch Taskswitch nach 1 Befehl
  2293.  move.w  (a0),-30(a4)      ; Open() restaurieren
  2294.  move.l  8(a0),-28(a4)
  2295.  jsr     -126(a6)          ; Enable()
  2296. notchanged:
  2297.  rts
  2298.  
  2299. testfile:
  2300.  move.l  a5,d2             ; d2 = Puffer, in den die Bytes eingelesen werden
  2301.  move.l  #1024,d3          ; d3 = Anzahl der zu lesenden Bytes
  2302.  movem.l d1-d7/a0-a6,-(sp)
  2303.  jsr     -42(a6)           ; Read()
  2304.  movem.l (sp)+,d1-d7/a0-a6
  2305.  rts
  2306.  
  2307. setend:                    ; in d0 wird Filelänge zurückgegeben
  2308.  moveq   #0,d2
  2309.  moveq   #1,d3             ;  END
  2310.  bra     seekit
  2311.  
  2312. openflag:      dc.b $ff ; $ff -> Open() wird von Kontroll-Task nicht verbogen
  2313. opencount:     dc.b 0   ; OpenRequester-Anzahl, ENDE erst wenn = 0
  2314. colorflag:     dc.b $ff ; grünes Farb-Signal bei Disk-Einlegen
  2315. searchfiles:   dc.b $ff ; durchsuche eventuelles S:NoWarning, S:VirusName-File
  2316. taskflag:      dc.b $ff ; $ff -> Task beginnt sofort mit Vektorenkontrolle
  2317. resetflag:     dc.b 0   ; um den ersten Disk-DOIO-Zugriff zu ignorieren
  2318. exitflag:      dc.b 0   ; wird gesetzt, wenn VIRUS-CONTROL entfernt werden soll
  2319. exitcount:     dc.b 0   ; exitcount = Warn-Window-Anzahl, ENDE erst wenn = 0
  2320. inuse0:        dc.b 0   ; wenn inuse-Flag des Laufwerkes gesetzt ist, wird
  2321. inuse1:        dc.b 0   ; kein weiteres Warn-Window aufgerufen
  2322. inuse2:        dc.b 0
  2323. inuse3:        dc.b 0
  2324. pointer:       dc.l 0   ; Zeiger auf Speicherbereich für VIRUS-CONTROL
  2325. BeginIOAdr:    dc.l 0   ; Adresse des BeginIO-Vektors des trackdisk-devices
  2326. lastBeginIO:   dc.l 0   ; letzter BeginIO-Vektor-Wert
  2327. restoreIO:     dc.l 0   ; BeginIO-Wert für Virus-Entfern-Versuch, kann je nach
  2328. ; Betriebssystem-Version verschieden sein, daher etwas aufwendiger programmiert
  2329. lastKickMem:   dc.l 0
  2330. lastKickTag:   dc.l 0
  2331. lastKickCheck: dc.l 0
  2332. lastDOIO:      dc.l newdoio-reset ; für CLI-Start setzen
  2333. lastCOOL:      dc.l reset-reset   ; für CLI-Start setzen
  2334. freeposition:  dc.l 0
  2335. dosbase:       dc.l 0
  2336. onediff1:      dc.b 0
  2337. nochfrei:      dc.b 0
  2338. intuition:     dc.b "intuition.library",0
  2339.  even
  2340. timerdev:      dc.b "timer.device",0
  2341.  even
  2342. unknown:       dc.b "Name nicht bekannt !           ",0
  2343. unknownend:    even
  2344. NoWarning:     dc.b "S:NoWarning",0
  2345.  even
  2346. VirusName:     dc.b "S:VirusName",0
  2347.  even
  2348. Kennung:       dc.l $000003e8  ; Modul-Name-Kennung
  2349.                dc.l $00000002  ; Name 2 Longword lang
  2350.                dc.b  "OIUS"    ; Markierung (wird bei Start zu PIUS)
  2351. Kennzahl:      dc.l $00000000  ; ursprüngliche Filelänge
  2352.                dc.l $000003f2  ; Modul-Ende-Kennung
  2353. filename:
  2354.  dc.b "RAW:0/0/640/170/BOOTBLOCK-DF"
  2355. unit4:                       dc.b "0:  weiter mit Taste ",0
  2356.  even
  2357. ; Bei Booten ist der Standardzeichensatz Topaz 9 eingestellt ist, wodurch
  2358. ; 60 Zeichen in Zeile dargestellt werden. Deshalb RAW: mit y=170 öffnen,
  2359. ; damit der gesamte Bootblock ohne Wegscrollen dargestellt wird.
  2360. ; RAW: statt CON:, damit auch mit z.B. F-tasten oder Cursor-tasten weiter.
  2361. ; Die Systemconfiguration wird erst am Ende der Bootroutine ausgewertet.
  2362.  
  2363. NOBOOT:       ; topaz80, da topaz60 zu lang,
  2364.  dc.b 1,0,0,0 ; weil rechts neben Gadgets ausgegeben wird
  2365.  dc.w 7,8
  2366.  dc.l font-reset,NOBOOTtext-reset,0
  2367. NOBOOTtext:
  2368.  dc.b "Bootblock-Virus in DF"
  2369. unit0:         dc.b "0: ?       PUBLIC DOMAIN !! CONTACTS WELCOMED !!",0
  2370.  even
  2371. NAME0:
  2372.  dc.b 1,0,0,0
  2373.  dc.w 0,0
  2374.  dc.l font-reset,NAME0text-reset,0
  2375. NAME0text:
  2376.  dc.b "                               ",0
  2377.  even
  2378. NAME1:
  2379.  dc.b 1,0,0,0
  2380.  dc.w 0,0
  2381.  dc.l font-reset,NAME1text-reset,0
  2382. NAME1text:
  2383.  dc.b "                               ",0
  2384.  even
  2385. NAME2:
  2386.  dc.b 1,0,0,0
  2387.  dc.w 0,0
  2388.  dc.l font-reset,NAME2text-reset,0
  2389. NAME2text:
  2390.  dc.b "                               ",0
  2391.  even
  2392. NAME3:
  2393.  dc.b 1,0,0,0
  2394.  dc.w 0,0
  2395.  dc.l font-reset,NAME3text-reset,0
  2396. NAME3text:
  2397.  dc.b "                               ",0
  2398.  even
  2399. ONEDIFF:
  2400.  dc.b 1,0,0,0
  2401.  dc.w 0,0
  2402.  dc.l font-reset,ONEDIFFtext-reset,0
  2403. ONEDIFFtext:
  2404.  dc.b "1 Longword-Unterschied",0
  2405.  even
  2406. OPENERR:
  2407.  dc.b 0,1,0,0
  2408.  dc.w 15,30
  2409.  dc.l font-reset,OPENERRtext-reset,0
  2410. OPENERRtext:
  2411.  dc.b "Warn-Window-DF"
  2412. unit3:         dc.b "0: Open-Error",0
  2413.  even
  2414. CORRECT:
  2415.  dc.b 0,1,0,0
  2416.  dc.w 15,30
  2417.  dc.l font-reset,CORRECTtext-reset,0
  2418. CORRECTtext:
  2419.  dc.b "String-Gadget-Inhalt-DF"
  2420. unit5: dc.b "0: richtig ? "
  2421. correctname:        dc.b "                                  ",0
  2422.  even
  2423. NOBOOTR:
  2424.  dc.b 0,1,0,0
  2425.  dc.w 7,4
  2426.  dc.l font-reset,NOBOOTRtext-reset,0
  2427. NOBOOTRtext: dc.b " ENDE ",0
  2428.  even
  2429. PROTECT:
  2430.  dc.b 0,1,0,0
  2431.  dc.w 15,30
  2432.  dc.l 0,PROTECTtext-reset,0
  2433. PROTECTtext:
  2434.  dc.b "Disk in DF"
  2435. unit2:     dc.b "0: ist schreibgeschützt !",0
  2436.  even
  2437. PROTECTL:
  2438.  dc.b 0,1,0,0
  2439.  dc.w 7,4
  2440.  dc.l 0,PROTECTLtext-reset,0
  2441. PROTECTLtext: dc.b " NEUER VERSUCH ",0
  2442.  even
  2443. ALREADYNO:
  2444.  dc.b 0,1,0,0
  2445.  dc.w 15,30
  2446.  dc.l 0,ALREADYNOtext-reset,0
  2447. ALREADYNOtext:
  2448.  dc.b "Bootblock DF"
  2449. unit6:       dc.b "0: schon in S:NoWarning !",0
  2450.  even
  2451. ALREADYNOdel:
  2452.  dc.b 0,1,0,0
  2453.  dc.w 7,4
  2454.  dc.l 0,ALREADYNOdeltext-reset,0
  2455. ALREADYNOdeltext:
  2456.  dc.b " ENTFERNEN ",0
  2457.  even
  2458. ALREADYVI:
  2459.  dc.b 0,1,0,0
  2460.  dc.w 15,30
  2461.  dc.l font-reset,ALREADYVItext-reset,0
  2462. ALREADYVItext:
  2463.  dc.b "Bootblock DF"
  2464. unit7:       dc.b "0: schon in S:VirusName: "
  2465. oldname:                              dc.b "                               ",0
  2466.  even
  2467. ALREADYWORK:
  2468.  dc.b 0,1,0,0
  2469.  dc.w 7,4
  2470.  dc.l 0,ALREADYWORKtext-reset,0
  2471. ALREADYWORKtext:
  2472.  dc.b " ENTFERNEN oder UEBERSCHREIBEN ",0
  2473.  even
  2474. ALREADYNOnam:
  2475.  dc.b 0,1,0,0
  2476.  dc.w 7,4
  2477.  dc.l font-reset,ALREADYNOnamtext-reset,0
  2478. ALREADYNOnamtext:
  2479.  dc.b " UEBERSCHREIBEN mit "
  2480. nameoverwrite:       dc.b "                               ",0
  2481.  even
  2482. OPENFILEnam:
  2483.  dc.b 0,1,0,0
  2484.  dc.w 15,30
  2485.  dc.l font-reset,OPENFILEnamtext-reset,0
  2486. OPENFILEnamtext:
  2487.  dc.b "ACHTUNG: ZUGRIFF auf "
  2488. filewrite:           dc.b "                               ",0
  2489.  even
  2490. EXIT:
  2491.  dc.b 0,1,0,0
  2492.  dc.w 15,30
  2493.  dc.l 0,EXITtext-reset,0
  2494. EXITtext:
  2495.  dc.b "VIRUS-CONTROL wirklich entfernen ?",0
  2496.  even
  2497. neusch:
  2498.  dc.b 0,1,0,0
  2499.  dc.w 7,4
  2500.  dc.l 0,neuschtext-reset,0
  2501. neuschtext:
  2502.  dc.b " Schützen ",0
  2503.  even
  2504. okk:
  2505.  dc.b 0,1,0,0
  2506.  dc.w 7,4
  2507.  dc.l 0,okktext-reset,0
  2508. okktext:
  2509.  dc.b " File okay ",0
  2510.  even
  2511. noloadf:
  2512.  dc.b 0,1,0,0
  2513.  dc.w 15,30
  2514.  dc.l 0,noloadftext-reset,0
  2515. noloadftext:
  2516.  dc.b "kein load-file: "
  2517. keinloadfile:        dc.b "                               ",0
  2518.  even
  2519. FILESCHUTZ:
  2520.  dc.b 0,1,0,0
  2521.  dc.w 15,30
  2522.  dc.l 0,FILESCHUTZtext-reset,0
  2523. FILESCHUTZtext:
  2524.  dc.b "File-Schutz: "
  2525. checkfilename:       dc.b "                               ",0
  2526.  even
  2527. link:
  2528.  dc.b 0,1,0,0
  2529.  dc.w 15,30
  2530.  dc.l font-reset,linktext-reset,0
  2531. linktext:
  2532.  dc.b "Filelänge verändert !! -> LINK-VIRUS ?? -> "
  2533. linkname: dc.b "                               ",0
  2534.  even
  2535. WRITEBB:
  2536.  dc.b 0,1,0,0
  2537.  dc.w 15,30
  2538.  dc.l font-reset,WRITEBBtext-reset,0
  2539. WRITEBBtext:
  2540.  dc.b "ACHTUNG: SCHREIBZUGRIFF auf Bootblock DF"
  2541. unit8:                                   dc.b "0:  in Lesen wandeln ?",0
  2542.  even
  2543. OVERWRITE:
  2544.  dc.b 0,1,0,0
  2545.  dc.w 15,30
  2546.  dc.l 0,OVERWRITEtext-reset,0
  2547. OVERWRITEtext:
  2548.  dc.b "Bootblock  in DF"
  2549. unit1:          dc.b "0: wirklich überschreiben ?",0
  2550.  even
  2551. OVERWRITEL:
  2552.  dc.b 0,1,0,0
  2553.  dc.w 7,4
  2554.  dc.l 0,OVERWRITELtext-reset,0
  2555. OVERWRITELtext: dc.b "  JA  ",0
  2556.  even
  2557. OVERWRITER:
  2558.  dc.b 0,1,0,0
  2559.  dc.w 7,4
  2560.  dc.l 0,OVERWRITERtext-reset,0
  2561. OVERWRITERtext: dc.b " NEIN ",0
  2562.  even
  2563. BOOT:
  2564.  dc.b 0,1,0,0
  2565.  dc.w 15,30
  2566.  dc.l 0,NOBOOTtext-reset,0
  2567. BOOTL:
  2568.  dc.b 0,1,0,0
  2569.  dc.w 7,4
  2570.  dc.l 0,BOOTLtext-reset,0
  2571. BOOTLtext: dc.b " Disk-Boot-Routine ",0
  2572.  even
  2573. BOOTR:
  2574.  dc.b 0,1,0,0
  2575.  dc.w 7,4
  2576.  dc.l 0,BOOTRtext-reset,0
  2577. BOOTRtext: dc.b " Boot-Simulation ",0
  2578.  even
  2579. REALLYBOOT:
  2580.  dc.b 0,1,0,0
  2581.  dc.w 15,30
  2582.  dc.l 0,REALLYBOOTtext-reset,0
  2583. REALLYBOOTtext:
  2584.  dc.b "links: startet eventuellen Disk-Boot-VIRUS !!",0
  2585.  even
  2586.  
  2587. vektor0:
  2588.  dc.b 0,1,0,0
  2589.  dc.w 15,30
  2590.  dc.l 0,vektor0text-reset,0
  2591. vektor0text: dc.b "       -Vektor verändert -> VIRUS ? - AMIGA AUS !!",0
  2592.  even
  2593. VEKTORL:
  2594.  dc.b 0,1,0,0
  2595.  dc.w 7,4
  2596.  dc.l font-reset,VEKTORLtext-reset,0  ; Topaz80 da > 60 Zeichen
  2597. VEKTORLtext:
  2598.  dc.b " VIRUS-ENTFERN-VERSUCH -> Absturzgefahr -> besser AMIGA AUS !! ",0
  2599.  even
  2600.  
  2601. gadtext16:
  2602.  dc.b 1,0,0,0
  2603.  dc.w 7,3
  2604.  dc.l font-reset,gadtext16text-reset,0
  2605. gadtext16text: dc.b "  FileSuche    AN ",0
  2606.  even
  2607. gadtext15:
  2608.  dc.b 1,0,0,0
  2609.  dc.w 7,3
  2610.  dc.l font-reset,gadtext15text-reset,0
  2611. gadtext15text: dc.b "  CheckOpen   AUS ",0
  2612.  even
  2613. gadtext14:
  2614.  dc.b 1,0,0,0
  2615.  dc.w 7,3
  2616.  dc.l font-reset,gadtext14text-reset,0
  2617. gadtext14text:dc.b "   File - Schutz",0
  2618.  even
  2619. gadtext13:
  2620.  dc.b 1,0,0,0
  2621.  dc.w 7,3
  2622.  dc.l font-reset,gadtext13text-reset,0
  2623. gadtext13text:dc.b " Kill System-Virus",0
  2624.  even
  2625. gadtext12:
  2626.  dc.b 1,0,0,0
  2627.  dc.w 7,3
  2628.  dc.l font-reset,gadtext12text-reset,0
  2629. gadtext12text:dc.b "in S:VirusName-File",0
  2630.  even
  2631. gadtext11:
  2632.  dc.b 1,0,0,0
  2633.  dc.w 7,3
  2634.  dc.l font-reset,gadtext11text-reset,0
  2635. gadtext11text:dc.b "in S:NoWarning-File",0
  2636.  even
  2637. gadtext8:
  2638.  dc.b 1,0,0,0
  2639.  dc.w 7,3
  2640.  dc.l font-reset,gadtext8text-reset,0
  2641. gadtext8text: dc.b "Beende VirusControl",0
  2642.  even
  2643. gadtext7:
  2644.  dc.b 1,0,0,0
  2645.  dc.w 7,3
  2646.  dc.l font-reset,gadtext7text-reset,0
  2647. gadtext7text: dc.b "r.Checksum ->  Boot",0
  2648.  even
  2649. gadtext6:
  2650.  dc.b 1,0,0,0
  2651.  dc.w 7,3
  2652.  dc.l font-reset,gadtext6text-reset,0
  2653. gadtext6text: dc.b "f.Checksum ->NoBoot",0
  2654.  even
  2655. gadtext5:
  2656.  dc.b 1,0,0,0
  2657.  dc.w 7,3
  2658.  dc.l font-reset,gadtext5text-reset,0
  2659. gadtext5text: dc.b "NoFastMem-BootBlock",0
  2660.  even
  2661. gadtext4:
  2662.  dc.b 1,0,0,0
  2663.  dc.w 7,3
  2664.  dc.l font-reset,gadtext4text-reset,0
  2665. gadtext4text: dc.b "Standard -BootBlock",0
  2666.  even
  2667. gadtext3:
  2668.  dc.b 1,0,0,0
  2669.  dc.w 7,3
  2670.  dc.l font-reset,gadtext3text-reset,0
  2671. gadtext3text: dc.b "File   -> BootBlock",0
  2672.  even
  2673. gadtext2:
  2674.  dc.b 1,0,0,0
  2675.  dc.w 7,3
  2676.  dc.l font-reset,gadtext2text-reset,0
  2677. gadtext2text: dc.b "Bootblock ->   File",0
  2678.  even
  2679. gadtext1:
  2680.  dc.b 1,0,0,0
  2681.  dc.w 7,3
  2682.  dc.l font-reset,gadtext1text-reset,0
  2683. gadtext1text: dc.b "BootBlock -> Schirm",0
  2684.  even
  2685. gadtext0:
  2686.  dc.b 1,0,0,0
  2687.  dc.w 7,3
  2688.  dc.l font-reset,gadtext0text-reset,0
  2689. gadtext0text: dc.b  "  FarbSignal   AN ",0
  2690.  even
  2691.  
  2692. gad16:            ;   Files durchsuchen
  2693.  dc.l 0
  2694.  dc.w 430,6*18+48,166,12,0,1,1
  2695.  dc.l gadborder-reset,0,gadtext16-reset,0,0
  2696.  dc.w 16
  2697.  dc.l 0
  2698. gad15:            ;   Check Open
  2699.  dc.l gad16-reset
  2700.  dc.w 430,5*18+48,166,12,0,1,1
  2701.  dc.l gadborder-reset,0,gadtext15-reset,0,0
  2702.  dc.w 15
  2703.  dc.l 0
  2704. gad14:            ; File - Schutz
  2705.  dc.l gad15-reset
  2706.  dc.w 430,3*18+43,166,12,0,1,1
  2707.  dc.l gadborder-reset,0,gadtext14-reset,0,0
  2708.  dc.w 14
  2709.  dc.l 0
  2710. gad13:            ; Kill System-Virus
  2711.  dc.l gad14-reset
  2712.  dc.w 230,6*18+48,166,12,0,1,1
  2713.  dc.l gadborder-reset,0,gadtext13-reset,0,0
  2714.  dc.w 13
  2715.  dc.l 0
  2716. gad12:           ; in S:VirusName-File
  2717.  dc.l gad13-reset
  2718.  dc.w 230,3*18+43,166,12,0,1,1
  2719.  dc.l gadborder-reset,0,gadtext12-reset,0,0
  2720.  dc.w 12
  2721.  dc.l 0
  2722. gad11:           ; in S:NoWarning-File
  2723.  dc.l gad12-reset
  2724.  dc.w 230,2*18+43,166,12,0,1,1
  2725.  dc.l gadborder-reset,0,gadtext11-reset,0,0
  2726.  dc.w 11
  2727.  dc.l 0
  2728. gad10:
  2729.  dc.l gad11-reset
  2730.  dc.w 30,1*18-3,566,53,3,1,1  ; GADGHNONE, damit völlig unauffällig bleibt
  2731.  dc.l gadborder1-reset,0,NOBOOT-reset,0,0
  2732.  dc.w 10
  2733.  dc.l 0
  2734. gad8:            ; Beende VirusControl
  2735.  dc.l gad10-reset
  2736.  dc.w 430,2*18+43,166,12,0,1,1
  2737.  dc.l gadborder-reset,0,gadtext8-reset,0,0
  2738.  dc.w 8
  2739.  dc.l 0
  2740. gad7:            ; (Virus)DiskBoot  AN
  2741.  dc.l gad8-reset
  2742.  dc.w 230,5*18+48,166,12,0,1,1
  2743.  dc.l gadborder-reset,0,gadtext7-reset,0,0
  2744.  dc.w 7
  2745.  dc.l 0
  2746. gad6:            ; (Virus)DiskBoot AUS
  2747.  dc.l gad7-reset
  2748.  dc.w 230,4*18+48,166,12,0,1,1
  2749.  dc.l gadborder-reset,0,gadtext6-reset,0,0
  2750.  dc.w 6
  2751.  dc.l 0
  2752. gad5:            ; NoFastMem-BootBlock
  2753.  dc.l gad6-reset
  2754.  dc.w 30,6*18+48,166,12,0,1,1
  2755.  dc.l gadborder-reset,0,gadtext5-reset,0,0
  2756.  dc.w 5
  2757.  dc.l 0
  2758. gad4:            ; Standard -BootBlock
  2759.  dc.l gad5-reset
  2760.  dc.w 30,5*18+48,166,12,0,1,1
  2761.  dc.l gadborder-reset,0,gadtext4-reset,0,0
  2762.  dc.w 4
  2763.  dc.l 0
  2764. gad3:            ; File   -> BootBlock
  2765.  dc.l gad4-reset
  2766.  dc.w 30,4*18+48,166,12,0,1,1
  2767.  dc.l gadborder-reset,0,gadtext3-reset,0,0
  2768.  dc.w 3
  2769.  dc.l 0
  2770. gad2:            ; Bootblock ->   File
  2771.  dc.l gad3-reset
  2772.  dc.w 30,3*18+43,166,12,0,1,1
  2773.  dc.l gadborder-reset,0,gadtext2-reset,0,0
  2774.  dc.w 2
  2775.  dc.l 0
  2776. gad1:            ; BootBlock -> Schirm
  2777.  dc.l gad2-reset
  2778.  dc.w 30,2*18+43,166,12,0,1,1
  2779.  dc.l gadborder-reset,0,gadtext1-reset,0,0
  2780.  dc.w 1
  2781.  dc.l 0
  2782. gad0:            ;   FarbSignal
  2783.  dc.l gad1-reset
  2784.  dc.w 430,4*18+48,166,12,0,1,1
  2785.  dc.l gadborder-reset,0,gadtext0-reset,0,0
  2786.  dc.w 0
  2787.  dc.l 0
  2788.  
  2789. gad90:                                     ; je nach Laufwerk entsprechendes
  2790.  dc.l gad0-reset                           ; Stringgadget als FirstGadget
  2791.  dc.w 37,8*18+38,566,12,0,1,4              ; setzen, als nächstes Gadget ist
  2792.  dc.l gadborders-reset,0,0,0,string0-reset ; gad0,gad1,gad2 usw. bereits
  2793.  dc.w 9                                    ; gesetzt
  2794.  dc.l 0
  2795. string0:
  2796.  dc.l buff0-reset,undo0-reset
  2797.  dc.w 0,buff1-buff0,0,0,0,0,0,0
  2798.  dc.l 0,0,0
  2799. gad91:
  2800.  dc.l gad0-reset
  2801.  dc.w 37,8*18+38,566,12,0,1,4
  2802.  dc.l gadborders-reset,0,0,0,string1-reset
  2803.  dc.w 9
  2804.  dc.l 0
  2805. string1:
  2806.  dc.l buff1-reset,undo1-reset
  2807.  dc.w 0,buff1-buff0,0,0,0,0,0,0
  2808.  dc.l 0,0,0
  2809. gad92:
  2810.  dc.l gad0-reset
  2811.  dc.w 37,8*18+38,566,12,0,1,4
  2812.  dc.l gadborders-reset,0,0,0,string2-reset
  2813.  dc.w 9
  2814.  dc.l 0
  2815. string2:
  2816.  dc.l buff2-reset,undo2-reset
  2817.  dc.w 0,buff1-buff0,0,0,0,0,0,0
  2818.  dc.l 0,0,0
  2819. gad93:
  2820.  dc.l gad0-reset
  2821.  dc.w 37,8*18+38,566,12,0,1,4
  2822.  dc.l gadborders-reset,0,0,0,string3-reset
  2823.  dc.w 9
  2824.  dc.l 0
  2825. string3:
  2826.  dc.l buff3-reset,undo3-reset
  2827.  dc.w 0,buff1-buff0,0,0,0,0,0,0
  2828.  dc.l 0,0,0
  2829.  
  2830. gadborder:           ; für alle Gadgets, außer Stringgadget und oberes Gadget
  2831.  dc.w -1,-1
  2832.  dc.b 2,1,0,18
  2833.  dc.l pairs-reset,0
  2834. gadborders:          ; für das Stringgadget
  2835.  dc.w -8,-4          ; GadgetID = 9
  2836.  dc.b 2,1,0,18
  2837.  dc.l pairss-reset,0
  2838. gadborder1:          ; für das große obere Informations-Gadget
  2839.  dc.w -1,-1          ; GadgetID = 10
  2840.  dc.b 2,1,0,18
  2841.  dc.l pairs1-reset,0
  2842.  
  2843. pairs:               ; der Schatteneffekt wird durch die Borderlinien erzielt
  2844.  dc.w 0,13, 0,0, 167,0, 167,13, 0,13, 1,14, 168,14, 168,0, 169,1,
  2845.  dc.w 169,15, 170,15, 170,2, 171,3, 171,15, 2,15, 3,16, 172,16, 172,4
  2846. pairss:
  2847.  dc.w 0,13, 0,0, 567,0, 567,13, 0,13, 1,14, 568,14, 568,0, 569,1,
  2848.  dc.w 569,15, 570,15, 570,2, 571,3, 571,15, 2,15, 3,16, 572,16, 572,4
  2849. pairs1:
  2850.  dc.w 0,54, 0,0, 567,0, 567,54, 0,54, 1,55, 568,55, 568,0, 569,1,
  2851.  dc.w 569,56, 570,56, 570,2, 571,3, 571,56, 2,56, 3,57, 572,57, 572,4
  2852.  
  2853. font:
  2854.  dc.l topazfont-reset
  2855.  dc.w 8
  2856.  dc.b 0,1
  2857. topazfont: dc.b "topaz.font",0
  2858.  even
  2859.  
  2860. ; 4 Stringgadget-Puffer, da bis zu 4 Laufwerks-Aufrufe gleichzeitig möglich
  2861. buff0: dc.b "ram:filename",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; kein even
  2862. buff1: dc.b "ram:filename",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; da je
  2863. buff2: dc.b "ram:filename",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0 ; 32 Bytes
  2864. buff3: dc.b "ram:filename",0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
  2865.  
  2866. window:            ; New-Window-Struktur des Warn-Windows
  2867.  dc.w 0,0,640,200
  2868.  dc.b 0,1          ; CLOSEWINDOW|GADGETUP
  2869.  dc.l $240,$100f,0 ; ACTIVATE|W.DEPTH|W.DRAG|W.CLOSE|W.SIZING|SMART_REFRESH
  2870.  dc.l 0,taskname-reset,0,0 ; Windowtitellänge egal
  2871.  dc.w 290,68,640,200,1     ; WBENCHSCREEN
  2872.  ; WINDOWSIZING -> kann Titel ganz lesen, aber wegen PrintIText einschränken
  2873. structtask: dc.l 0,0
  2874.             dc.b 1,0
  2875.             dc.l taskname-reset
  2876.             dc.b 0,0,0,0
  2877.             dc.l 0,0,0,0
  2878.             dc.w 0,0
  2879.             dc.l 0,0,0,0
  2880.             dc.l end-reset+9000,end-reset,end-reset+9000
  2881.             dc.l 0,0,0,0,0
  2882.             dc.w 0,0,0
  2883. end:
  2884. ; +9000 Bytes duch AllocMem belegen.
  2885. ; end       bis end+1024             Bootblock-Puffer für NoWarning-Funktion
  2886. ; end+1024  bis end+2*1024+32        Bootblock-Puffer für VirusName-Funktion
  2887. ; end+2080  bis end+2080+128         4 * 32-Byte-String-Gadget-Undo-Puffer
  2888. ; end+2208  bis end+2208+40+48+2*34  2*Request-Struktur,2*Port-Struktur
  2889. ; end+2364  bis end+2364+512         512-Byte-Sektor-Puffer für -t Option
  2890. ; end+2876  bis end+2876+1024        1024-Byte-Bootblock-Puffer für df0:
  2891. ; end+3900  bis end+3900+1024        1024-Byte-Bootblock-Puffer für df1:
  2892. ; end+4924  bis end+4924+1024        1024-Byte-Bootblock-Puffer für df2:
  2893. ; end+5948  bis end+5948+1024        1024-Byte-Bootblock-Puffer für df3:
  2894. ; end+6972  bis end+9000             Vektor-Kontroll-Task-Stack
  2895. ; Autorequester-Aufruf des Vektor-Kontroll-Tasks belegt circa 1.2 KB Stack,
  2896. ; 9000-6972 = 2028  Stack reicht aus.
  2897. Nobuff      = end
  2898. Vibuff      = Nobuff+1024
  2899. undo0       = Vibuff+1024+32
  2900. undo1       = undo0+32
  2901. undo2       = undo1+32
  2902. undo3       = undo2+32
  2903. timereq     = undo3+32         ; IORequest(32)+timeval(8) -> da AllocMem mit
  2904. timeport    = timereq+40       ; MsgPort(34)              -> MEMF_CLEAR mit 0
  2905. trackreq    = timeport+34      ; IOStdRequest(48)         -> vorbelegt
  2906. trackport   = trackreq+48      ; MsgPort(34)
  2907. blockbuff   = trackport+34
  2908. bootblock0  = blockbuff+512;
  2909. bootblock1  = bootblock0+1024
  2910. bootblock2  = bootblock1+1024
  2911. bootblock3  = bootblock2+1024
  2912.